4、主从部分表数据复制方案实施步骤
(1)在主机上执行授权配置
设置mysql数据复制账户
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.0.2' IDENTIFIED BY 'repl';
mysql> flush privileges;
在mysql主机上对slave开放3306端口的授权
ACCEPT tcp -- 10.0.0.2 0.0.0.0/0 state NEW tcp dpt:3306
(2)从库配置my.cnf
server-id = 2
log-bin=/data/mysql-middle-slave/mysql_datadir/mysql-bin
binlog_format=mixed
binlog_cache_size = 4M
max_binlog_size = 1024M
expire-logs-days = 10
slow_query_log = 0
long_query_time = 10
log-error = /var/log/mysqld-slave.log
slave-skip-errors = all
log_slave_updates = 1
skip-slave-start
#mysql replication policy
replicate_wild_do_table=mydatabase.code
replicate_wild_do_table=mydatabase.info
replicate_wild_do_table=mydatabase.location
replicate_wild_do_table=mydatabase.controller
replicate_wild_do_table=mydatabase.user_level
replicate_wild_do_table=mydatabase.check_type
replicate_wild_do_table=mydatabase.code_price
replicate_wild_do_table=mydatabase.service_info
replicate_wild_do_table=mydatabase.user_param
replicate_wild_do_table=mydatabase.method_info
replicate_wild_do_table=mydatabase.thread_code
(3)从主库导出一份数据快照
使用mysqldump来得到一个数据快照可分为以下几步:
因为主库设置的是transaction_isolation = REPEATABLE-READ,所以支持以下方法导出一致性的数据。仅导出需要实现主从复制的表。
mysqldump -uroot -p --single_transaction --master-data=2 mydatabase code info location controller user_level check_type code_price service_info user_param method_info thread_code > master_partial.sql
(4)拷贝备份数据至从库并导入
先确认从库上已经按正确字符集要求创建了数据库,再执行数据导入。
CREATE DATABASE `mydatabase` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql --port=9000 --socket=/data/mysql-middle-slave/mysql.sock -uroot -p mydatabase < master_partial.sql
(5)在备份文件master_partial.sql查看binlog和pos值
head -25 master_partial.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=122; #举例,大概22行
(6)从库设置从这个日志点同步并启动
mysql> change master to master_host='10.0.0.1',
-> master_user='repl',
-> master_password='repl',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=122;
mysql> start slave;
mysql> show slave status\G;
观察mysql主从同步线程的状态。
如果因故需要暂停主从复制,可以从机上执行:mysql>stop slave;
mysql从上的数据复制功能在重启mysqld服务后,需要手工登录mysql,并执行start slave进行开启。
(7)临时中止与恢复主从数据复制
从mysql5.6版本开始,在mysql slave上执行了stop slave命令后,虽然中止了主从间的数据复制服务,但主从复制的配置信息仍然会被保存在缓存中。所以如果此时继续执行start slave命令,则会正常得继续前面中断的主从复制工作。
如果在执行了stop slave命令后,又重启了mysql slave的服务,那么就需要重新做一遍主、从间数据复制的配置了。先前的主从配置信息,在重启后不复存在。
(8)主从间数据库表状态不一致时的处理办法
可以有各种情况会造成mysql slave的库表数据状态与master不一致。
这时可以先停止主从复制:在从机上登录mysql并执行stop slave;
在mysql从上执行reset slave;
重新按前面的操作方法,从master上导出一份库表数据并传输到从机上,导入mysql从;
在mysql从上,根据上一步中得到的备份文件大约第25行注明的master binlog信息,重新设置change master to主从复制配置;
在mysql从上,执行start slave,重新开启主从复制;
使用show slave status\G查看主从复制状态;
注: 在执行reset slave命令时,mysql slave会清除本地的一些日志文件(it clears the master info and relay log info repositories, deletes all the relay log files, and starts a new relay log file )。
(9)怎么在现有的库表之外,按需增减主从间进行数据复制的表
停从机的mysql数据复制服务,stop slave,reset slave;
修改从机的my.cnf文件,更新要过滤的库表信息;
重启从机的mysqld服务;
重新配置主、从间的数据同步、主从复制;