加快 MySQL 数据迁移

目录

一、先导

1. 自建目标实例

2. 配置目标主从

二、源导出

1. 生成查询用户权限的SQL语句

2. 生成权限的SQL语句

3. 生成创建非主键索引的SQL语句

4. 导出源库结构

5. 导出源库数据

三、目标导入

1. 目标实例设置

2. 创建用户与权限

3. 处理结构导出文件

4. 导入结构

5. 导入数据

6. 添加索引

四、后续

1. 配置到源的复制

2. 切换


一、先导

1. 自建目标实例


2. 配置目标主从


二、源导出

1. 生成查询用户权限的SQL语句

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock -e "
select concat('show grants for \`',user,'\`@\`',host,'\`;') from mysql.user where user not like 'mysql.%';" -N > show_grants.sql

2. 生成权限的SQL语句

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock -N < show_grants.sql > grants.sql
sed -i 's/$/&;/g' grants.sql;

3. 生成创建非主键索引的SQL语句

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock -e "
select concat('alter table ',table_schema,'.',table_name,' add ',concat('index ',index_name),' (',col,');') create_index
  from (
select table_schema,table_name,index_name,group_concat(column_name order by seq_in_index) col
  from information_schema.statistics 
 where table_schema in ('test', 'test_jhy') and index_name <> 'PRIMARY'
 group by table_schema,table_name,index_name
 order by table_schema,table_name,index_name) t;" -N > create_index.sql

4. 导出源库结构

# max_allowed_packet 不能大于目标库的值
mysqldump -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock --no-data --single-transaction --triggers --routines --events --set-gtid-purged=OFF --master-data=2 -e --max_allowed_packet=1073741824 -e --net_buffer_length=16384 --databases test test_jhy | gzip > dump_db.sql.gz

5. 导出源库数据

mysqldump -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock --single-transaction --set-gtid-purged=OFF --master-data=2 -e --max_allowed_packet=1073741824 -e --net_buffer_length=16384 --no-create-db --no-create-info --databases test test_jhy | gzip > dump_data.sql.gz


三、目标导入

1. 目标实例设置

bulk_insert_buffer_size=1073741824
innodb_buffer_pool_size=34359738368
innodb_flush_log_at_trx_commit=0
max_allowed_packet=1073741824
concurrent_insert=AUTO
innodb_autoinc_lock_mode=2

2. 创建用户与权限

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock < grants.sql

3. 处理结构导出文件

gunzip dump_db.sql.gz
# 删除除主键外的索引。不能删除主键,否则建表时遇到自增列报错:
# Incorrect table definition; there can be only one auto column and it must be defined as a key
sed -i '/ KEY `/d;' dump_db.sql
# 删除闭括号前的逗号
sed -i ':a;N;$!ba;s/,\n) ENGINE=InnoDB/\n) ENGINE=InnoDB/g' dump_db.sql

4. 导入结构

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock < dump_db.sql

5. 导入数据

gunzip dump_data.sql.gz
mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock < dump_data.sql

6. 添加索引

mysql -uwxy -p12345 -S /data/18253/mysqldata/mysql.sock < create_index.sql


四、后续

1. 配置到源的复制

# 查看复制坐标
more dump_data.sql

-- 配置并启动复制
change master to
master_host='10.10.10.1',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='aaaaaaaaaaaa',
master_log_pos=xxxxxx;

start slave;
show slave status\G

2. 切换

你可能感兴趣的:(MySQL,mysql)