1.传统方式: 基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以应用来达到主从同步的目的。
2.Gtid方式(MySQL>=5.7推荐使用): 基于GTID的复制中,从库会告知主库已经执行的事务的GTID的值,然后主库会将所有未执行的事务的GTID的列表返回给从库,并且可以保证同一个事务只在指定的从库执行一次。
准备工作
在做主从同步时,如果从机需要主机上原有数据,就要先复制一份到从机。
1 2 3 4 5 # 1. 收集主机原有数据 $ mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql # 2. 从机复制主机原有数据 $ mysql -uroot -p123456 -h127.0.0.1 --port=3306 < ~/master_db.sql
1 2 3 4 # centos7以上 firewall-cmd --add-port=3306/tcp --permanen # success 表示成功 # 重新载入配置 firewall-cmd --reload
传统方式 master配置 修改master配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # # 设置同步的binary log 二进制日志文件名前缀,默认为binlog log-bin=mysql-bin # 服务器唯一id ,默认为1 主数据库和从数据库的server-id不能重复 server-id=1 # # 需要主从复制的数据库 binlog-do-db=test # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M # 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) binlog_format=row # 设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。 expire_logs_days=7 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 # 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
创建一个用户,用来同步(也可以是root) 1 create user 'repl'@'%' identified by '123456'
修改用户权限 1 grant replication slave on *.* to 'repl'@'%'
刷新权限
查看日志以及位置 接着执行命令查看并记下binary log二进制日志文件名 File 以及位置 Position的值,需要在从数据库用到:
slave配置 修改配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # # 设置同步的binary log 二进制日志文件名前缀,默认是binlog log-bin=mysql-bin # 服务器唯一ID 主数据库和从数据库的server-id不能重复 server-id=2 # # 需要主从复制的数据库 replicate-do-db=test # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M # 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) binlog_format=row # 设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。 expire_logs_days=7 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 # 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 # relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件 relay_log=replicas-mysql-relay-bin # log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 # 防止改变数据(只读操作,除了特殊的线程) read_only=1
与master建立联系 1 change master to MASTER_HOST='master_ip',MASTER_PORT=master_port,MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=116990;
MASTER_HOST:主数据库的主机ip
MASTER_PORT:主数据库的端口,不设置则默认是3306
MASTER_USER:主数据库被授予同步复制权限的用户名
MASTER_PASSWORD:对应的用户密码
MASTER_LOG_FILE:在主数据库执行命令show master status
查询到的二进制日志文件名称
MASTER_LOG_POS:在主数据库执行命令show master status
查询到的位置 Position的值
开启主从复制工作
查看详细信息
假如显示 Slave_IO_Running
和 Slave_SQL_Running
为 Yes
,以及Slave_IO_State
为 Waiting for master to send event
,则证明主从复制成功!
停止主从复制
基于全局事务标识符(GTID)的方法 master配置 修改master 配置文件 1 2 3 4 5 6 7 8 9 # # 设置同步的binary log 二进制日志文件名前缀,默认为binlog log-bin=mysql-bin # 服务器唯一id ,默认为1 主数据库和从数据库的server-id不能重复 server-id=1 # 开启 GTID gtid_mode=on enforce_gtid_consistency=true
创建同步用户(与上面一样) 1 create user 'repl'@'%' identified by '123456'
授权用户 1 grant replication slave on *.* to 'repl'@'%'
刷新权限
查看状态
对比发现与基于二进制日志文件的方法不同的是Executed_Gtid_Set
会有一个具体的全局事务id值
slave配置 修改配置文件 1 2 3 4 5 6 7 8 9 # # 设置同步的binary log 二进制日志文件名前缀,默认是binlog log-bin=mysql-bin # 服务器唯一ID 主数据库和从数据库的server-id不能重复 server-id=2 # 开启 GTID gtid_mode=on enforce_gtid_consistency=true
创建关联 1 change master to MASTER_HOST='master_ip',MASTER_PORT=master_port,MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;
查看状态
假如显示 Slave_IO_Running
和 Slave_SQL_Running
为 Yes
,以及Slave_IO_State
为 Waiting for master to send event
,则证明主从复制成功!