毫无疑问,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 就可以了。
- 添加新评论
- 211 阅读
评论
这是个大工程哦
添加新评论