discuzx3.4本地数据库迁移阿里云数据库记录

作者 by 小楼 / 2022-04-19 / 暂无评论 / 117 个足迹

前两天看阿里云在做活动,单机版云数据库3年只要59块钱,就整了一个 想着把论坛的数据库迁移到云数据库上,可减轻服务器负载 提升论坛访问速度,没想到还挺麻烦。


[TOC]

为什么想要迁移数据库

主要是目前论坛用的阿里云香港1H1G配置的低配ECS,访问量大的时候负载较高,比较影响网页的加载速度,正好做活动云数据库又比较便宜,就想着整一下。

这样服务器只跑网页,数据库分离出来,且云数据库节点跟论坛服务器同在一个内网,延迟也低 应该是可以极大的提升论坛页面的加载速度。

迁移过程

一、配置云数据库与ECS网络互通

  1. 首先给云数据库的白名单添加ECS的内网IP,在 云数据库管理-数据库连接 处配置,配置完成后 会显示出来云数据库的内网连接URL。
  2. 之后开启云数据库网络的ClassicLink,在云数据库-专有网络页面的右上角开启。
  3. 设置ECS专有网络连接状态,在ECS实例详情-网络信息处设置,将ECS与云数据库专有网络链接上,此时ECS与云数据库内网已通。
  4. ECS和云数据库内网通了后,可以在ECS上使用命令登录云数据库了。
mysql -h xxxx.mysql.rds.aliyuncs.com -u user -p passwd


二、导出本地数据库

最开始考虑过阿里云自带的DTS数据迁移,但是收费不说 还不好用,所以直接在ECS上命令行远程登录云数据库,命令导出数据库即可。

mysqldump -u user -p passwd --database dbname > dbname.sql

这样直接导出,然后在导入时出现问题了,跟导出方式无关。
是本地MySQL跟云数据库有些差异,导致导入数据时报错了,类似如下错误提示:

there can be only one auto column and it must be defined as a key


什么原因导致的导入报错?

是因为discuz默认使用MyISAM引擎,而各大云服务商考虑性能,均使用innodb引擎,所以导入数据库时会转换引擎。由于innodb和myisam底层原理的不同,会导致有些表转换失败。

如何解决

  1. discuz主要就是pre_forum_post该表存在问题,转换失败是由于innodb的主键语法和myisam不同导致,这时我们需要手动修改一下主键,只要将主键中的position和tid换一下位置,并调整pre_forum_post表的引擎为InnoDB即可。
--登录本地数据库
mysql -u user -p passwd
--调整位置
ALTER table pre_forum_post DROP PRIMARY KEY , ADD PRIMARY KEY (`position`,`tid`) ;
--调整`pre_forum_post`表的引擎为InnoDB
ALTER TABLE pre_forum_post ENGINE = InnoDB;
  1. 现在就可以重新导出本地数据库文件了
mysqldump -u user -p passwd --database dbname > dbname.sql


三、导入数据库文件到云数据库

导入数据很简单,直接命令行登陆云数据库,然后命令导入即可

mysql -h xxxx.mysql.rds.aliyuncs.com -u user -p passwd
source /root/dbname.sql;

如此,数据库就已迁移完成,下面修改discuzx配置文件。

四、修改discuzx连接数据库的配置文件

需要修改的文件有三个,如下:

configconfig_global.php

configconfig_ucenter.php

uc_serverdataconfig.inc.php

将其中的数据库地址、用户名密码、数据库名称修改为云数据库的即可。

// ----------------------------  CONFIG DB  ----------------------------- //
$_config['db']['1']['dbhost'] = '云数据库地址';
$_config['db']['1']['dbuser'] = '云数据库用户名';
$_config['db']['1']['dbpw'] = '云数据库密码';
$_config['db']['1']['dbcharset'] = 'gbk';
$_config['db']['1']['pconnect'] = '0';
$_config['db']['1']['dbname'] = '云数据库名';
$_config['db']['1']['tablepre'] = 'pre_';
$_config['db']['common']['slave_except_table'] = '';
$_config['db']['slave'] = '';

至此,discuzx本地数据库迁移到阿里云数据库全部完成,将本地数据库服务停止,打开论坛检查一切正常,并且网页打开的加载速度比之前确实快了好多倍,负载也很低。

独特见解