本文实例讲述了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_idserver_id = 1#开启binlog日志log-bin = mysql-bin
create user '用户名'@'%' identified by '密码';grant replication slave on *.* to '用户名'@'%';
#设置server_idserver_id = 10
mysqldump -u root -p --all-databases --routines --events --triggers --single-transaction --master-data > 导出路径
mysql -u root -p -f < 主库备份文件.sql
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;

三、设置主主复制

假设主库分别是master1和master2。

1、设置master2为只读

set @@global.read_only = on;
create user '用户名'@'%' identified by '密码';grant replication slave on *.* to '用户名'@'%';
show master status;
CHANGE MASTER TO MASTER_HOST='MASTER2主机IP',MASTER_USER='MASTER2复制用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='二进制日志名称',MASTER_LOG_POS=二进制日志位置;
start slave;
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 = TABLErelay-log-info-repository = TABLE
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';
start slave for channel 'server1';start slave for channel 'server2';

要获取指定通道的从库状态,show slave status for channel '通道名称'\G;

五、设置复制筛选器

可以选择要复制哪些表或数据库,在主库上,可以使用--binlog-do-db 和 --binlog-ignore-db 选项来选择要记录变更的数据库,以控制二进制日志。更好的方法是控制从库。

1、复制指定数据库

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (db1, db2);
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = ('db1.table1');
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.tb_%');
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (db1, db2);
CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = ('db1.table1');

比如现在服务器A为主库,服务器B和服务器C为从库,复制于服务器A。现在想把服务器C作为服务器B的从库。

1、在服务器C上停止从库运行

stop slave;show slave status\G;

2、在服务器B上停止从库运行

stop slave;show slave status\G;

3、将服务器B的日志位置与服务器C的进行比较,找出哪一个是服务器A最新同步,通常,服务器C先停止从库运行,服务器B的日志会更靠前。

4、在服务器C上,使用 START SLAVE UNTIL 语句将其同步到服务器B的日志位置:

START SLAVE UNTIL MASTER_LOG_FILE='上一步中服务器B日志名称', MASTER_LOG_POS=上一步中服务器B日志位置;

6、在服务器B上,查看主库状态,启动从库。

show master status;start slave;show slave status\G;
stop slave;CHANGE MASTER TOMASTER_HOST='服务器B的IP',MASTER_USER='服务器B复制用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='上一步中通过show master status获取日志名称',MASTER_LOG_POS=上一步中通过show master status获取日志位置;
start slave;show slave status\G;

服务器A->服务器B->服务器C,如果想让服务器C直接作为服务器A的从库,该怎么做?

1、在服务器B上,停止从库运行,并记录主库状态

stop slave;show master status\G;

一旦延迟被追上,就停止从库的运行。

stop slave;
show slave status\G;start slave;
stop slave;CHANGE MASTER TO MASTER_HOST='服务器A的IP',MASTER_USER='服务器A的复制用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='上一步中获取的日志',MASTER_LOG_POS=上一步中获取的日志位置;
start slave;show slave status\G;

为什么需要延迟复制,有可能主库上执行了一条灾难性语句,你必须通过备份中的时间点恢复,如果数据库大小过大,这将导致长时间停机。

为了避免出现这种情况,可以使用一个延迟的从库,如果发生了灾难,并且延迟的从库还没有执行这条灾难性语句,则可以先停止复制,让从库跳过该灾难语句,最后把从库提升为主库。

1、停止从库运行

stop slave;
CHANGE MASTER TO MASTER_DELAY = 3600;start slave;
show slave status\G;

SQL_Remaining_Delay:延迟还剩余的秒数,当保持延迟时,这个值是NULL。

Slave_SQL_Running_State:SQL线程的状态

九、设置 GTID 复制

全局事务标识符 GTID 是在程序中创建的唯一标识符,并与主库上提交的每个事务相关联。该标识符是唯一的,不仅在主库上,在其他从库上,它都唯一。

上面描述的所有复制,都需要指明二进制文件和复制起点的位置,如果将一个从库的主库切换到另一个,就必须重新获取二进制文件位置,这会很麻烦。

为了避免,可以使用基于 GTID 的复制,mysql 使用 GTID 自动检测二进制日志的位置。

1、在所有数据库中 my.cnf 中启动 GTID

[mysqld]gtid_mode = ONenforce-gtid-consistency = 1skip_slave_start
set @@global.read_only = on;

4、重新启动主库。

5、在从库上执行 CHANGE MASTER TO 命令来设置 GTID 复制

CHANGE MASTER TOMASTER_HOST='主库IP',MASTER_PORT=3306,MASTER_USER='复制用户',MASTER_PASSWORD='密码',MASTER_AUTO_POSITION=1;

十、设置半同步复制

默认情况下,复制是异步的,主库不知道写入操作是否到达从库,如果主库与从库间存在延迟,主库崩了,尚未到达从库的那些数据就会丢失。

为了解决这种问题,半同步复制,主库会一直等待,直到至少有一个从库接收到写入的数据。

1、在主库上,安装 rpl_semi_sync_master 插件

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
install plugin rpl_semi_sync_master SONAME 'semisync_master.dll';
select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%';
set @@global.rpl_semi_sync_master_enabled=1;set @@global.rpl_semi_sync_master_timeout=100;
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.dll';
select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%';
set global rpl_semi_sync_slave_enabld = 1;STOP SLAVE IO_THREAD;START SLAVE IO_THREAD;
show status like 'rpl_semi_sync_master_clients';
show status like 'rpl_semi_sync_master_status';

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  3. Android(安卓)- Manifest 文件 详解
  4. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  5. Selector、shape详解(一)
  6. android2.2资源文件详解4--menu文件夹下的菜单定义
  7. Android发送短信方法实例详解
  8. Android(安卓)读取资源文件实例详解
  9. 详解Android中的屏幕方向

随机推荐

  1. Android UI开发第九篇――SlidingDrawer
  2. 我所理解的Android模块化(一)——模块化概
  3. 转:Android推送通知指南
  4. Android(安卓)第二季
  5. Android jni 常用方法备忘
  6. 通过JavaScript或PHP检测Android设备
  7. Android DEV : setOnClickListener() vs.
  8. Android使用ksoap2调用C#中的webservice
  9. 1.1 创建android工程
  10. 初识Android系统平台