跳转到主要内容
首页

用户帐户菜单

  • 登录

主导航

  • 首页
  • 小公司运营
  • 网站建设
  • 创业杂谈
  • 兼职赚钱
  • 小微企业信息化
  • 手册教程
    • 《大伟哥的Drupal 8建站指南》
    • 《通过JohnChow.Com在网上赚钱》
  • 关于

面包屑

  • 首页
  • Drupal 网站数据从 MySQL 迁移到 PostgreSQL

Drupal 网站数据从 MySQL 迁移到 PostgreSQL

By 大伟哥 | 2023-07-22,周六, 21:31

毫无疑问,Drupal 用户大部分还是在使用官方推荐的Mysql/Mariadb, 但是 PostgreSQL 也是相当亮眼的。经过我的测试发现,如果你想把原有MySQL数据 转换成 PostgreSQL,也是可行的。

大伟哥是按照 Drupal 官网上的文档 Convert MySQL to PostgreSQL 操作的,但是这篇文档里提到的步骤比较简略,解释也不太到位,所以对于不熟悉命令行的人来说,可以会发生些小错误,我就给大家分享一下更详细的操作步骤。

在开始之前,先说明一下操作系统,软件版本和现有 Drupal 网站的配置,方便你把命令修改成适合你自己的参数:

操作系统:Debian 12, 代号bookworm
操作系统用户:david
Web服务器: Apache 2.4.57
PHP:8.2.7
数据库:

数据库 版本号 数据库名称 数据库用户 数据库密码
MariaDB 10.11.3 daweibromysql mysqluser mysqlpassword
PostgreSQL 15.3 daweibropgsql pgsqluser pgsqlpassword

一、创建PostgreSQL数据库

首先,使用postgres用户,创建新的PostgreSQL数据库daweibropgsql,指定数据库所有者为pgsqluser:

 

david@debian12:~$ sudo -i -u postgres
postgres@debian12:~$ createdb --encoding=UNICODE --owner=pgsqluser daweibropgsql

然后 exit 返回 Debian 正常用户 david .

二、安装数据库转换工具pgloader

Pgloader 就是从 MySQL 迁移到 PostgreSQL 的真正利器,仅仅一条命令,就可以把你的 MySQL 数据库迁移到 PostgreSQL. 它不是阿猫阿狗随便写的不知名数据转换工具,而是从 Debian 10 开始就直接收录进Debian源的软件包,Debian 系的 Linux 可以通过apt install pgloader 直接安装。其他系统可以从源码编译安装。

以下是 Debian 12 下的安装:

david@debian12:~$ sudo apt update
david@debian12:~$ sudo apt install pgloader

安装好以后,查看当前版本,确认成功安装:

david@debian12:~$ pgloader --version
pgloader version "3.6.7~devel"
compiled with SBCL 2.2.9.debian

三、转换数据库

这是最关键的一步,也是最容易出错的一步。Drupal 官网给出的命令格式是:

pgloader mysql://root:root@localhost/olddatabasae 
postgresql://postgres:postgres@localhost/newdatabasae

这个命令里,用户名和密码是相同的,很多网友不清楚到底是什么意思,它实际上是这样子的:

pgloader mysql://mysql用户名:mysql用户密码@localhost/mysql数据库名称
postgresql://postgresql用户名:postgresql用户密码@localhost/postgresql数据库名称

在我这个例子里,正确的命令格式就应该替换成:

david@debian12:~$ pgloader mysql://mysqluser:mysqlpassword@localhost/daweibromysql 
postgresql://pgsqluser:pgsqlpassword@localhost/daweibropgsql

使用了上面的命令格式,一般就能转换成功了,但是还有可能出错。这个时候不能着急,一定要看清楚出错原因,寻找相应的解决方案。有可能是密码错误,参数拼写错误,或者运行用户不对。

四、修正PostgreSQL数据库表模式 table schemas

使用用户 pgsqluser 进入数据库 daweibropgsql, 并查看导入的数据表:

david@debian12:~$ psql -U pgsqluser -d daweibropgsql
Password for user pgsqluser: pgsqlpassword 
psql (15.3 (Debian 15.3-0+deb12u1)) Type "help" for help. 
daweibropgsql=>

最后这行输出表明已经进入数据库 daweibropgsql 了。这里如果出错,很入可能是装完 PostgreSQL 后没有修改登录认证方式,这种情况可能会报错:psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "pgsqluser". 解决方法可以参考前一篇笔记:安装及使用 PostgreSQL 作为 Drupal 后端数据库

接下来,我们继续查看转换后的新数据库情况:

daweibropgsql=> \dt+

  List of relations
    Schema     |                   Name                   | Type  |    Owner  | Persistence...

---------------+------------------------------------------+-------+-----------+-------------
 daweibromysql | ban_ip                                   | table | pgsqluser | permanent   
 daweibromysql | batch                                    | table | pgsqluser | permanent   
 daweibromysql | block_content                            | table | pgsqluser | permanent
 daweibromysql | block_content__body                      | table | pgsqluser | permanent 
 daweibromysql | block_content_field_data                 | table | pgsqluser | permanent
 daweibromysql | block_content_field_revision             | table | pgsqluser | permanent 
 daweibromysql | block_content_revision                   | table | pgsqluser | permanent

我们会发现,转换后的数据库里,table schemas 保留了原来的数据库名称 daweibromysql,作为单独网站的后端数据库,我们并不需要与其他网站合用一个数据库,因此这个表模式不是我们想要的,我们可以把它们批量修改成一般 PostgreSQL 数据库里的表模式,public. 

这需要在数据库里面,运行一小段DO Block: 

daweibropgsql=> DO $$
DECLARE
    row record;
BEGIN
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'daweibromysql'
    LOOP
        EXECUTE 'ALTER TABLE ' || quote_ident(row.tablename) || ' SET SCHEMA public;';
    END LOOP;
END$$;

运行这个代码块后,终端会返回DO, 表示运行成功了。我们再次\dt+列出并查看数据表,会发现Schema列已经成啊功修改为 public 了。这时再运行\q 退出数据库,返加正常用户就行了:

 DO
daweibropgsql=> \dt+
List of relations
 Schema |                   Name                   | Type  |    Owner  | Persistence
--------+------------------------------------------+-------+-----------+------------
 public | ban_ip                                   | table | pgsqluser | permanent  
 public | batch                                    | table | pgsqluser | permanent  
 public | block_content                            | table | pgsqluser | permanent   
 public | block_content__body                      | table | pgsqluser | permanent   
 public | block_content_field_data                 | table | pgsqluser | permanent   
 public | block_content_field_revision             | table | pgsqluser | permanent   
daweibropgsql=> \q
david@debian12:~$

五、修改 Drupal settings.php 文件有关数据库的部分

vim /var/www/html/daweibro.com/web/sites/default/settings.php:

$databases['default']['default'] = array (
  'database' => 'daweibropgsql',
  'username' => 'pgsqluser',
  'password' => 'pgsqlpassword',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '5432',
  'driver' => 'pgsql',
);

上面代码格式和MySQL的是一样的,修改成相应的内容就可以了。

六、Drush 确认结果并清除缓存

david@debian12:~$ cd /var/www/html/daweibro.com/
david@debian12:/var/www/html/daweibro.com$ vendor/drush/drush/drush status
Drupal version   : 9.5.10
Site URI         : http://default
DB driver        : pgsql
DB hostname      : localhost
DB port          : 5432
DB username      : pgsqluser
DB name          : daweibropgsql
Database         : Connected
Drupal bootstrap : Successful
Default theme    : daweibro_w3css
Admin theme      : claro
PHP binary       : /usr/bin/php8.2
PHP config       : /etc/php/8.2/cli/php.ini
PHP OS           : Linux
PHP version      : 8.2.7
Drush script     : /var/www/html/daweibro.com/vendor/drush/drush/drush
Drush version    : 11.6.0
Drush temp       : /tmp
Drush configs    : /var/www/html/daweibro.com/vendor/drush/drush/drush.yml
Install profile  : standard
Drupal root      : /var/www/html/daweibro.com/web
Site path        : sites/default
Files, Public    : sites/default/files
Files, Temp      : /tmp
david@debian12:/var/www/html/daweibro.com$ vendor/drush/drush/drush updb
david@debian12:/var/www/html/daweibro.com$ vendor/drush/drush/drush cr
 [success] Cache rebuild complete.

这时候,网站应该可以正常打开了,样式没变,但是驱动的数据库已经切换成PostgreSQL了,进入后台,查看状态报告,可能会看到一个错误,就是没有启用 PostgreSQL 扩展,我们去扩展部分启用 PostgreSQL 就可以了。 

网站建设
  • 添加新评论
  • 251 阅读
Drupal
PostgreSQL

评论

王光卫博客18

1 year 4 months 之前

永久连接

这是个大工程哦

这是个大工程哦
  • 回复

添加新评论

此字段内容将保密,不会被其他人看见。
关于文本格式
  • 不允许使用HTML标签。
CAPTCHA
16 + 1 =
计算出这道简单的算术题并键入答案。例如、1+3,就输入 4。
发布评论前,请通过下面的验证,以免被当作垃圾评论机器人屏蔽。

搜索

沪ICP备17000093号-1

公安备案沪公网安备 31011402008254号

© 2016-2022 大伟哥博客版权所有