大表快速迁移
# 注意事项:
1. 可传输表空间方案仅适用于Innodb引擎;
2. 表必须使用独立表空间(innodb_file_per_table=on);
3. 可传输表空间需要锁定目标表(如果已有其他锁,则等待),业务应提前进行评估;
4. discard tablespace 操作不支持分区表;
5. discard tablespace操作不支持所有福字关系的表(暂时禁用外键: foreign_key_checks=0,此时import tablespaces)时才不会检查主外键关系);
#################################################
# Step1 导出表 【源库操作】
# session_A 执行:
flush tables tbl_name for export; # 刷新表脏数据,等待并添加锁表(同时生成tbl_name.cfg文件,存储表的数据字典信息)
# session_B 执行:【注意空间是否充足】
TMOUT=0
cd /data/mysql/data/
# 复制数据字典信息文件至目标库数据目录(目标库的主备节点都需要操作)
scp -pr tbl_name.cfg username@1.1.1.1:/tmp/
# 复制数据文件至目标库数据目录(目标库的主备节点都需要操作)
scp -pr tbl_name.ibd username@1.1.1.1:/tmp/
# session_A 执行:
# 解锁表
unlock tables;
# Step2 导入表 【目标库操作】
------------------------------------------------
警告! 千万务必确认正在操作的主机是目标主机,否则会造成数据丢失!!!
警告! 千万务必确认正在操作的主机是目标主机,否则会造成数据丢失!!!
警告! 千万务必确认正在操作的主机是目标主机,否则会造成数据丢失!!!
------------------------------------------------
# 1. 创建表结构
create table tbl_name ... # 创建表结构(从源库获得创建语句,注意自增主键需要重置)
alter table tbl_name discard tablespace; # 注意!!! 会删除表.ibd文件,请谨慎操作
# 2. 移动数据文件
su - root
mv /tmp/tbl_name* /data/mysql/data/
chown -R mysql. /data/mysql/data
# 3. 导入表空间
# 导入表(主备环境时,仅主库操作即可)
alter table tbl_name import tablespace;
# 验证数据量
select count(*) from tbl_name;
# 校验目标表
checksum table tbl_name;
#################################################