mysql-主从复制
三步骤:
1、master将改变记录到二进制日志。这些记录过程叫做二进制日志事件,binary log events
2、slave将master的binary log events拷贝到它的中继日志(relay log)
3、slave重做中继日志中的事件,将改变应用到自己的数据库中。mysql复制是异步的且串行化的
master和slave的mysql版本最好一致
原理:主服务器建立二进制日志,每产生语句或磁盘变化,写进日志;授权复制账号
从服务器建立中继日志;利用复制账号来监听主服务器的日志
实操步骤:
配置binlog日志文件和中继日志文件
主机
1、主服务器ID必须唯一:server_id = 1
2、必须启用二进制日志文件:
log-bin=mysql-bin
# 指定日志格式
binlog-format=mixed # statement(语句)、 row(行)、 mixed(语句和行的混合)
3、启用错误日志
log-error=/var/mysql/mysql-error.log
4、根目录
basedir=指mysql的安装位置
tmpdir= # 临时目录
datadir= # 数据存储目录
read-only=0
binlog-format=mixed/row/
binlog-ignore-db=mysql
从机:
从服务器唯一ID:server-id=2
启用二进制日志:relay-log=mysql-relay # 开启中继日志
建立账户并授权slave
主机:
#grant replication slave on *.* to 'zhansan'@'zhuji' identified by 'new-password';
grant replication client,replication slave on *.* to 'repl'@'192.169.%.%' identified by 'new-password';
flush privileges;
start master;
show master status; # 取得File:mysqlbin.00001文件和Postion:331位置的值
从机:
change master to
master_host='ip-address'
master_user='zhansan'
master_password='new-password'
master_log_file='mysqlbin.00001',master_log_pos=331;
start slave;
show status slave; # 查看slave_io_running和slave_sql_running是否开启,如果开启成功就是yes
reset slave; # 重置slave的状态
stop slave; # 停止slave
注意show slave status查看file和position位置的重要性
# 主主复制会出现主键冲突,该如何解决
set session auto_increment=2; # 每步增长2
set session auto_increment=1; # 从1开始增长
set global auto_increment_increment=2;
set global auto_increment_increment=1;
## log-bin二进制日志
日志配置:
开启:log-bin=mysql-bin
设置binlog的格式:binlog-format=mixed # statement,row,mixed
设置log能存储的最大值:max_binlog_size=104857200 # 10M
设置值保留几天的binlog日志:expire_logs_days=7
设置日志只记录指定库的更新:binlog-do-db=db_name
设置日志不记录指定库的更新:binlog-ignore-db=db_name
设置写缓冲多少次,刷一次磁盘,默认为0:sync_binlog=0
查看日志状态和事件:
查看日志是否开启:show variables like '%log_bin%'
查看binlog列表:show binary logs
查看最新的binlog:show master status
查看binlog执行的事件:show binlog events in 'mysql-bin.000001'
查看binlog日志的格式:show global variables like '%binlog-format%';
查看binlog的二进制文件:mysqlbinlog mysql-bin.000001 | more
### 通过mysqlbinlog命令手动恢复数据:
1、show binary logs;
2、show binlog events in 'mysql-bin.0000001'; # 找到pos的开始和结束位置
3、mysqlbinlog --no-defaults --database=dblog--base64-output=decode-rows -vv --start-position=1359 --stop-position=5484 mysql-bin.000001 > backup.sql # 将1359 - 5484位点的数据恢复成自定义的sql文件
-v:自动生成带注释的SQL语句
-v -v|-vv:生成列的描述信息,会生成字段的类型、长度、是否为null等
--base64-output=decode-rows:日志为rows类型时的解码操作
binlog-format的类型时row的情况下遇到的问题:
(1)、binlog出现读不懂的编码,可用--base64-output=decode-rows来解决
(2)、解码后的sql非原生sql,那么如何解决尼?
show variables like 'binlog_rows_query_log_events';
set binlog_rows_query_log_events=1;
flush logs;
参考链接:https://www.cnblogs.com/kerrycode/p/9315949.html
(3)、解码后发现insert、update、delete等操作被注释掉了?
暂未找到解决方法,
但是网上有用binlog2sql来解析二进制日志文件
参考连接:https://www.cnblogs.com/rickiyang/p/13841811.html