本文整理自网络,侵删。
本文实例讲述了mysql 复制原理与实践应用。分享给大家供大家参考,具体如下:
复制功能是将一个mysql数据库上的数据复到一个或多个mysql从数据库上。
复制的原理:在主服务器上执行的所有DDL和DML语句都会被记录到二进制日志中,这些日志由连接到它的从服务器获取,并复制到从库,并保存为中继日志,
这个过程由一个称为 IO线程 的线程负责,还有一个称为 SQL线程 的则按顺序执行中继日志中的语句。
复制有多种拓扑形式:
1、传统复制,一主多从,一个主服务器多个从服务器。
2、链式复制,一台服务器从主库复制,而另一台服务器又从这台复制,中间服务器又叫中继主库。
3、主主复制,两个主库互相接受写入和复制。
4、多源复制,一个从库,从多个主库复制。
一、复制如何操作
1、在主库上启用二进制日志记录。
2、在主库上创建一个复制用户。
3、在从训上设置唯一的 server_id。
4、从主库中备份数据。
5、在从库上恢复主库备份的数据。
6、执行CHANGE MASTER TO命令。
7、开始复制。
二、具体的操作步骤如下:
1、在 主库 上,启用二进制日志并设置server_id。
#设置server_id server_id = 1 #开启binlog日志 log-bin = mysql-bin
2、在主库上创建复制用户
create user '用户名'@'%' identified by '密码'; grant replication slave on *.* to '用户名'@'%';
3、在从库上设置server_id
#设置server_id server_id = 10
4、备份主库上的数据
mysqldump -u root -p --all-databases --routines --events --triggers --single-transaction --master-data > 导出路径
5、在从库上恢复主库导出的数据
mysql -u root -p -f < 主库备份文件.sql
6、在从库上执行 CHANGE MASTER TO 命令
CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='主库复制用户', MASTER_PASSWORD='密码', MASTER_LOG_FILE='二进制日志名称', MASTER_LOG_POS=二进制日志位置;
二进制日志名称和二进制日志位置,已经在备份主库文件中包含了,类似如下所示:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000016', MASTER_LOG_POS=47845;
7、从库上运行 start slave,然后 show slave status\G; 查看复制状态;
三、设置主主复制
假设主库分别是master1和master2。
1、设置master2为只读
set @@global.read_only = on;
2、在master2上创建复制用户,如果存在,则不用创建了
create user '用户名'@'%' identified by '密码'; grant replication slave on *.* to '用户名'@'%';
3、确保master2已开启二进制日志,检查master2上的二进制日志的坐标
show master status;
4、根据第2步的信息,在master1上执行 CHANGE MASTER TO 命令
CHANGE MASTER TO MASTER_HOST='MASTER2主机IP', MASTER_USER='MASTER2复制用户', MASTER_PASSWORD='密码', MASTER_LOG_FILE='二进制日志名称', MASTER_LOG_POS=二进制日志位置;
5、在master1上开启 slave 模式
start slave;
6、设置master2为可读写
set @@global.read_only = off;
四、设置多源复制
设置 server3 为 server1 和 server2 的从库。
1、设置 server1 和 server2 的二进制日志和server_id,具体操作可参考上面。
2、在 server1 和 server2 上创建复制用户,具体操作可参考上面。
3、在 server3 上设置 server_id。
4、备份 server1 和 server2 的数据。
5、在 server3 上恢复 server1 和 server2 上备份的数据。
6、在 server3 上,将复制存储库从 FILE 改为 TABLE,
stop slave; set global master_info_repository = 'TABLE'; set global relay_log_info_repository = 'TABLE';
还需要在配置文件中修改:
[mysqld] master-info-repository = TABLE relay-log-info-repository = TABLE
7、在 server3 上,执行 CHANGE MASTER TO 命令,并命名通道名
CHANGE MASTER TO MASTER_HOST='server1主机IP', MASTER_USER='server1复制用户', MASTER_PASSWORD='密码', MASTER_LOG_FILE='server1二进制日志名称', MASTER_LOG_POS=server1二进制日志位置 FOR CHANNEL 'server1'; CHANGE MASTER TO MASTER_HOST='server2主机IP', MASTER_USER='server2复制用户', MASTER_PASSWORD='密码', MASTER_LOG_FILE='server2二进制日志名称', MASTER_LOG_POS=server2二进制日志位置 FOR CHANNEL 'server2';
8 、在 server3 上,为每个通道执行 START SLAVE FOR CHANNEL 语句
start slave for channel 'server1'; start slave for channel 'server2';
9、查看同步状态,show slave status\G;
要获取指定通道的从库状态,show slave status for channel '通道名称'\G;
五、设置复制筛选器
可以选择要复制哪些表或数据库,在主库上,可以使用--binlog-do-db 和 --binlog-ignore-db 选项来选择要记录变更的数据库,以控制二进制日志。更好的方法是控制从库。
1、复制指定数据库
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);
2、复制指定表
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = ('db1.table1');
3、如果想使用通配符来选择表
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.tb_%');
4、忽略数据库
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1, db2);
5、忽略指定表
CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = ('db1.table1');
六、将从库由主从复制切换到链式复制
比如现在服务器A为主库,服务器B和服务器C为从库,复制于服务器A。现在想把服务器C作为服务器B的从库。
1、在服务器C上停止从库运行
stop slave; show slave status\G;
记录下Relay_Master_Log_File和Exec_Master_Log_Pos的值
2、在服务器B上停止从库运行
stop slave; show slave status\G;
记录下Relay_Master_Log_File和Exec_Master_Log_Pos的值
3、将服务器B的日志位置与服务器C的进行比较,找出哪一个是服务器A最新同步,通常,服务器C先停止从库运行,服务器B的日志会更靠前。
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。