FAQ
问: 现在支持多少区域间的跨域迁移?
UDTS 跨域迁移利用到了 UDPN或者专线,现在部署的服务区域为北京,上海,新加坡。以此3个区域有UDPN/专线传输线路的区域皆可支持。
问:MySQL 全量迁移需要满足哪些条件
1. 权限要求
MySQL(包括UDB MySQL) 全量迁移需要迁移的账号具有权限: SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT
假设你的迁移账号为 backupuser ,你可以通过以下命令查看权限,
确保 Selectpriv、Reloadpriv、Locktablespriv、Replclient_priv 的值为 Y
mysql > SELECT User,Host,Select_priv,Reload_priv,Lock_tables_priv,Repl_client_priv FROM mysql.user WHERE User = "backup_user"\G; User | backup_user Host | % Select_priv | Y Reload_priv | Y Lock_tables_priv | Y Repl_client_priv | Y
2. sql_mode 一致
为了保证迁移能正确执行,最好保持 源和目标数据库的 sqlmode 一致,可以通过一下命令查询 sqlmode
select @@sql_mode; --- 或者 show variables like "sql_mode";
如果目标数据库和源数据的 sql_mode 不一致,可以通过下面的命令进行修改
SET @@GLOBAL.sql_mode='xxxx';
其中具体的值,可以通过连接源数据库查询。
3. binlog 格式
如果您在完成全量迁移之后,需要增加增量迁移,需要要求 binlogformat 为 ROW, binlogrow_image 为 FULL(如果有这个变量的话, MySQL 5.5 中没有这个变量)
4. 视图(view) 权限
当源数据库有视图时,需要要求迁移的账号拥有 super 权限,如果您使用的是 UDB-MySQL,可以通过下面的命令获取 super 权限
update mysql.user set super_priv = 'Y' where user = 'root'; flush privileges;
问: MySQL 增量迁移需要满足哪些条件
1. 权限要求
MySQL(包括UDB MySQL) 增量迁移需要迁移的账号具有权限:SELECT, REPLICATION SLAVE, REPLICATION CLIENT
假设你的迁移账号为 backup_user ,你可以通过以下命令查看权限,
确保 Selectpriv、Replslavepriv、Replclient_priv 的值为 Y
mysql > SELECT User,Host,Select_priv,Repl_slave_priv,Repl_client_priv FROM mysql.user WHERE User = "backup_user"\G; User | backup_user Host | % Select_priv | Y Repl_slave_priv | Y Repl_client_priv | Y
2. binlog 配置要求
增量迁移要求 MySQL(包括UDB MySQL) 的 binlog 格式为 ROW,且如果有 binlogrowimage 变量,其值需要为 FULL
可以通过下面的命令查看
show global variables like 'binlog_format'; show global variables like 'binlog_row_image';
如果增量任务启动前,binlog_format 值不为 ROW,需要再次执行全量任务,以保证 binlog 信息正确。
3. 停止 event
-- 停止所有 event SET GLOBAL event_scheduler = OFF; -- 如果按库迁移,停止指定库的 event 即可 -- 查找对应的 event 并停止 SHOW EVENTS; ALTER EVENT hello DISABLE;
问: 增量提示 only support ROW format binlog 该如何操作
增量迁移要求 MySQL(包括UDB MySQL) binlog_format 值为 ROW
1. 修改配置文件(默认为 my.cnf ),重启 MySQL
[mysqld] ... binlog_format = ROW binlog_row_image = FULL ...
备注: 如果是 MySQL 5.5 ,没有 binlogrowimage 这个变量,不需要设置
2. 通过 MySQL 命令设置
FLUSH TABLES WITH READ LOCK; FLUSH LOGS; SET GLOBAL binlog_format = 'ROW'; FLUSH LOGS; UNLOCK TABLES;
如果你使用的是 master-slave 模式,需要执行以下命令
在 slave 节点上执行
stop slave;
在 master 上执行
FLUSH TABLES WITH READ LOCK; FLUSH LOGS; SET GLOBAL binlog_format = 'ROW'; FLUSH LOGS; UNLOCK TABLES;
在 slave 上执行
start slave;
备注:
通过 SET GLOBAL binlogformat = 'ROW'; 设置参数,
再次通过 show global variables like 'binlogformat'; 查询到的值还是旧的值,需要重新断开连接再次连接后才会显示变更后的值。
问:ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column
这是由于迁移的 MySQL(UDB-MySQL) 的 sql_mode 不一致导致的, 目标库的日期不允许 '0000-00-00' 这种无效的日期。
可以通过下面的命令查看 sql_mode
select @@sql_mode; --- 或者 show variables like "sql_mode";
通过增加 ALLOWINVALIDDATES 来允许插入这种无效的日期, 在查询出来的 sqlmode 值的后面,加上 ALLOWINVALID_DATES
通过以下命令对 sql_mode 进行修改
SET @@GLOBAL.sql_mode='xxxx,ALLOW_INVALID_DATES';
这里的 xxxx 是指原有查询出来的 sql_mode 值
问: Error 1451: Cannot delete or update a parent row: a foreign key constraint fails
假设有 group、user 两个 table 如下
CREATE TABLE `group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(100) COLLATE utf8_bin NOT NULL, `password` varchar(512) COLLATE utf8_bin NOT NULL, `group_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `gid` (`group_id`), CONSTRAINT `g_fk1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; INSERT INTO `group` (`id`, `name`) VALUES (1, 'group1'); INSERT INTO `user` (`id`, `user_name`, `password`, `group_id`) VALUES (1, 'test_user', '123456', 1);
当我们执行删除时
DELETE FROM `group` WHERE `id` = 1;
MySQL 会出现
Cannot delete or update a parent row: a foreign key constraint fails (`db1`.`user`, CONSTRAINT `g_fk1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`))
原因是,我们删除 group 的时候,其关联的 user 对应的数据不知道如何操作。
对于这种情况,我们需要设置级联删除/更新规则,参考规则如下
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
比如
-- 级联更新与删除 ALTER TABLE `user` ADD CONSTRAINT `g_fk2` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;