Halo Tech

WordPress 与Halo的爱恨情仇:无缝迁移全攻略

前言 各位程序员朋友们好,我是Halo。今天咱们来聊聊 WordPress 这个全球最流行的 CMS 系统在我们数据库上的那些事儿。最近接了个活儿,要求适配 WordPress ,过程中踩了不少坑,也积累了一些经验。咱们不整那些虚的,直接上干货。

第一部分:WordPress 初始化到Halo

1.1 数据库配置

Halo说 :选哪个?别问我,问你的领导和预算!但建议先挑兼容 MySQL 协议的那些,毕竟 WordPress 原生是为 MySQL 设计的,比如我们就兼容了MySQL协议,无需更改程序代码,拿上就能用。
--更改配置文件vim postgresql.conf...mysql.default_tenant = 'halo0root'cluster_net_services = ':3307:mysql' #format 'IP:port:mode'...-- 建立用户psql -p 5432CREATE EXTENSION aux_mysql CASCADE;SET password_encryption=mysql_native_password;CREATE USER test password 'test';GRANT ALL PRIVILEGES ON DATABASE halo0root TO test;SHOW  mysql.default_tenant ;SHOW cluster_net_services ;mysql -P 3306 -h <Server IP> -utest -p--建立数据库create database wordpress;


1.2 WordPress 配置调整

关键点在 wp-config.php 文件:
// 修改配置define( 'DB_NAME', 'wordpress' );define( 'DB_USER', 'test' );define( 'DB_PASSWORD', 'test' );define( 'DB_HOST', 'IP:3307' );define( 'DB_CHARSET', 'utf8' );define('DB_COLLATE', 'utf8mb4_general_ci');// 表名前缀$table_prefix = 'wp_';

1.3 安装过程观察

安装过程中盯紧几个地方:

数据库连接日志表创建语句执行情况初始数据插入是否成功
Halo经验 : 如果卡在"建立数据库连接"这一步,99%是权限问题或网络问题。 打开 http : //IP/wp-admin/install.php 初始化wordpress数据库
此时尝试登录后报错了,我跟踪到原因,几张核心的表的ID字段是大写的,这个问题好解决,我把相应字段做个映射就行。
--例如这个语句 用到大写IDSELECT   wp_posts.ID                                         FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)                                         WHERE 1=1  AND (   wp_term_relationships.term_taxonomy_id IN (2)) AND wp_posts.post_type = 'wp_global_styles' AND ((wp_posts.post_status = 'publish'))                                         GROUP BY wp_posts.ID                                         ORDER BY wp_posts.post_date DESC                                         LIMIT 0, 1
更新系统表
psql -p 5432INSERT INTO mys_informa_schema.schema_table_columns values('wordpress', 'wp_users', 'ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress', 'wp_posts', 'ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress', 'wp_comments', 'comment_ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress', 'wp_comments', 'comment_post_ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress', 'wp_comments', 'comment_author_IP');
再次尝试登录,进入到后台了:
Halo说 :这问题不是 Halo 的锅,是 WordPress 和 MySQL 历史包袱太重,我们能帮你绕过这个坑,但真正解决得靠规范设计。

1.4 数据完整性检查

安装完后,先别急着高兴,跑几个检查:
-- 检查核心表是否存在mysql> SELECT COUNT(*) FROM wp_posts;+-------+| count |+-------+|     4 |+-------+1 row in set (0.00 sec)mysql> SELECT COUNT(*) FROM wp_options;+-------+| count |+-------+|   132 |+-------+1 row in set (0.00 sec)mysql> SELECT COUNT(*) FROM wp_users;+-------+| count |+-------+|     1 |+-------+1 row in set (0.00 sec)-- HALO提醒:wp_posts 表至少应该有 Hello World 文章

1.5 功能性检查

站点展示

添加若干文章


查看下站点

文章、页面、评论等功能能使用,很平滑
到这,基本的功能都行了,我们来点不一样的,下面是从MySQL迁移到Halo上看看能不能跑。

第二部分:MySQL 到Halo 迁移实战

2.1 迁移前的准备工作

Halo忠告 : 迁移前先备份!先备份!先备份!重要的事情说三遍。
# MySQL 备份示例mysqldump -P 3306 -h 127.0.0.1 -u user1 -p wordpress > wordpress_backup.sql

2.2 数据迁移工具选择

几个靠谱的迁移方案:
数据库厂商提供的迁移工具(首选)使用第三方工具如 DataX老土但有效的 SQL 导出导入
Halo说 :别想着自己写迁移脚本,除非你想加班到天亮。我这次老土点,用SQL导入。

2.3 迁移步骤详解

1.直接导入:

mysql -P 3307 -h 127.0.0.1 -u test  -p wordpress_re <wordpress_backup.sqlmysql -P 3307 -h 127.0.0.1 -utest -p
2.验证数据量
mysql> select count(*) from wp_posts;+-------+| count |+-------+|     5 |+-------+1 row in set (0.00 sec)mysql>  SELECT COUNT(*) FROM wp_options;+-------+| count |+-------+|   140 |+-------+1 row in set (0.00 sec)mysql> SELECT COUNT(*) FROM wp_users;+-------+| count |+-------+|     1 |+-------+1 row in set (0.00 sec)
3.特殊处理 :
大小写字段
psql -p 5432INSERT INTO mys_informa_schema.schema_table_columns values('wordpress_re', 'wp_users', 'ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress_re', 'wp_posts', 'ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress_re', 'wp_comments', 'comment_ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress_re', 'wp_comments', 'comment_post_ID');INSERT INTO mys_informa_schema.schema_table_columns values('wordpress_re', 'wp_comments', 'comment_author_IP');

2.4 迁移后验证

核心检查点 :
1.用户能否登录2.文章能否正常显示3.插件是否正常工作4.后台操作是否流畅

电商插件WooCommerce也没问题

第三部分:常见坑与解决方案

  1. 字符集问题 :
    • 症状:文章显示乱码
    • 解法:统一使用 utf8mb4
  2. 自增ID冲突 :
    • 症状:插入数据报主键冲突
    • 解法:Halo在迁移之后,自增id自行设置。
  3. 特定SQL语法不兼容 :
    • 症状:插件报SQL错误
    • 解法:Halo做适配,凭借我们现在的版本,还没遇到这个特定语法的SQL不兼容的问题,。
Halo语录 :遇到问题先查日志,别急着问人,数据库的日志通常很详细。

结语

无缝迁移成功,功能都跑通,介于市场上的插件种类繁多,每个插件开发者的开发习惯不同,对数据库的操作也是有差别的,我们这测主流的插件没问题,做技术适配就像做翻译,不仅要准确传递信息,还要考虑说话的习惯和语境。我们不敢说已经做到完美,但我们承诺会持续改进,让Halo在WordPress环境下运行得越来越顺畅。 邀请大家一起完善 我们深知,WordPress的生态庞大而复杂,单靠我们的测试难免会有遗漏。如果你在使用过程中遇到:
  • 任何数据库相关的兼容性问题
  • 查询性能问题
  • 或其他奇怪的bug
请务必告诉我们 !我们会 :
第一时间分析问题如果是共性问题,会尽快推出通用解决方案如果是特殊情况,也会帮你找到临时应对方案
感谢每一位愿意给我们反馈的用户,你们的声音是我们进步的最大动力。