迁移准备
终于把一个小应用放到阿里的云服务器上了,因为用的是 MySQL 5.6 的数据库,试试使用 DTS 迁移到阿里云的数据库上。购买了 MySQL 5.6 的数据库,创建好了账号和数据库,于是直接开始迁移。
预检查报错
- 权限错误
迁移的账号需要具有数据复制的权限,列举下数据库中常用的权限
权限 | 权限级别 | 权限说明 |
---|---|---|
CREATE/DROP | 库表(索引) | 创建删除 |
ALTER/DELETE/INDEX/INSERT/SELECT/UPDATE | 表 | 更改删除索引插入查询更新 |
CREATE (SHOW) VIEW | 视图 | 创建(查看)视图 |
ALTER(CREATE) ROUTINE | 存储过程 | 更改(创建)存储过程 |
EXECUTE | 存储过程 | 执行存储过程 |
FILE | 服务器主机上的文件访问 | 文件访问权 |
CREATE TEMPORARY TABLES | 服务器管理 | 创建临时表权限 |
LOCK TABLES | 服务器管理 | 锁表权限 |
CREATE USER | 服务器管理 | 创建用户权限 |
PROCESS | 服务器管理 | 查看进程权限 |
RELOAD | 服务器管理 | 执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限 |
REPLICATION CLIENT | 服务器管理 | 复制 |
REPLICATION SLAVE | 服务器管理 | 复制 |
SHOW DATABASES | 服务器管理 | 查看数据库权限 |
SHUTDOWN | 服务器管理 | 关闭数据库权限 |
SUPER | 服务器管理 | 执行kill线程权限 |
而 DTS 需要的是 REPLICATION SLAVE 和 REPLICATION CLIENT 权限
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%';
mysql> SHOW GRANTS FOR 'user'@'%';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for user@% |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%' IDENTIFIED BY PASSWORD '****' |
| GRANT ALL PRIVILEGES ON `datebase`.* TO 'user'@'%' |
+------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
- 源库server_id检查
由于阿里云的 RDS 数据库采用的是主从架构,所以需要开启设置 server_id ,参考
源数据库需要设置 server_id 大于 1,源库 serverid 没有设置,增量迁移不能成功拉取 binlog,设置的方式
set global server_id=某个不为1的数
建议在配置文件中,直接配置 server_id=某个不为1的数
mysql> SHOW GLOBAL VARIABLES like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 0 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL server_id=2;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL VARIABLES like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
- 开启源库 binlog
如果源库 binlog 没有开启,增量迁移无法拉取事务日志。
调用命令 show global variables like 'log_bin';
确认 log_bin=on
。在源实例,更改 my.conf, 设置 log_bin,并重启MySQL后重新进行预检查
mysql> SHOW GLOBAL VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/my-binlog |
| log_bin_index | /var/lib/mysql/my-binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.00 sec)
- 源库binlog模式
源库默认为源库 binlog format 的格式需要 raw 格式,需要在源库执行 set global binlog_format=ROW
后重新进行预检查。建议在配置文件中设置 binlog_format = ROW
,重启MySQL,否则连接中的 session 可能以非ROW模式继续写入.
#Add to DTS
server_id = 2
log-bin = my-binlog
binlog_format = ROW
mysql> SHOW VARIABLES LIKE 'binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)