--------上节回顾--------
1、mysqldump
链接:-u -p -S -h -P
-A ,-B,库,表
-R --triggers -E
--master-data=2 :会记录备份时二进制的位置,写入备份文件里。
--single-transaction
--set-gtid-purged=OFF 构建主从的备份,不能加OFF,可以是ON或AUTO
把备份的所有的gtid去掉;
--max-allowed-packet= 备份大表时加上;
2、xtrabackup工具:
innobackupex
全备:innobackupex --user --password --no-timestamp /备份路径
增量:innobackupex --user --password --no-timestamp --incremental-basedir=/备份参照物 /增量备份路径
整理备份:
整理全备:innobackupex --apply-log --redo-only /全备路径
整理增量:
innobackupex --apply-log --redo-only --incremental-dir=/增量的备份 /全备
整理最后一次整理:一定不要用--redo-only,此前所有的备份整理都要加--redo-only
恢复:
innobackupex --copy-back /全备;
3、备份工具如何配合binlog应用
binlog截取最重要的是找到 起点和终点
周三下午两点:数据损坏,截取日志的思路
mysqldump:
起点:找到周二晚上全备脚本,找到change master to 语句;
终点:通过看events 或文件内容 找到故障点的位置。
xtrabackup
起点:找到周二晚上增量备份,备份路径下xtrabackup_binlog_info;
终点:通过看events 或文件内容 找到故障点的位置。
异构迁移
操作系统版本不一样,数据库一样:
逻辑备份即可,通用
数据库软件不一样:
MySQL --CSV-->MongoDB,ES
MySQL--JSON-->MongoDB,ES
--------------主从复制--------------
一、介绍
依赖于二进制日志的,实时备份的一个多节点架构;
二、搭建主从复制
1、关于主从复制的前提
至少两个实例;
不同的server_id;
主库需要开启二进制日志;
主库需要授权一个专用复制用户;
主库数据备份;
开启专用复制线程;
2、搭建主从复制
(1)准备多实例
①#mkdir -p /data/330{7,8,9}/data
②配置文件:
#cat > /data/3307/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin
EOF
#cat > /data/3308/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
port=3308
server_id=8
log_bin=/data/3308/mysql-bin
EOF
#cat > /data/3309/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
port=3309
server_id=9
log_bin=/data/3309/mysql-bin
EOF
③初始化三套数据:
#pkill mysqld
#mv /etc/my.cnf /etc/my.cnf.bak
#mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/application/mysql
#mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/application/mysql
#mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/application/mysql
④systemd管理多实例:
#cd /etc/systemd/system
#cp mysqld.service mysqld3307.service
#cp mysqld.service mysqld3308.service
#cp mysqld.service mysqld3309.service
#vim mysqld3307.service
ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
#vim mysqld3308.service
ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
#vim mysqld3309.service
ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
⑤授权:
#chown -R mysql.mysql /data/*
⑥启动:
#systemctl start mysqld3307.service
#systemctl start mysqld3308.service
#systemctl start mysqld3309.service
⑦验证多实例:
#lsof -i :3307
#lsof -i :3308
#lsof -i :3309
#netstat -lnp|grep 330
⑧检查server_id的情况:
#mysql -S /data/3307/mysql.sock -e "select @@server_id"
#mysql -S /data/3308/mysql.sock -e "select @@server_id"
#mysql -S /data/3309/mysql.sock -e "select @@server_id"
⑨检查3307(主库)的二进制日志情况:
#mysql -S /data/3307/mysql.sock -e "show variables like '%log_bin%'"
(2)准备主从复制搭建
①登录主库:3307
#mysql -S /data/3307/mysql.sock
创建复制用户:
mysql>grant replication slave on *.* to repl@'%' identified by '123';
进行主库数据备份:
#mysqldump -S /data/3307/mysql.sock -A --master-data=2 -R -E --triggers --single-transaction >/backup/full3307.sql
②恢复数据到从库:3308
#mysql -S /data/3308/mysql.sock
mysql>set sql_log_bin=0
mysql>source /backup/full3307.sql
告诉从库复制的信息:
change master to
ip
端口
用户名
密码
binlog相关
找帮助文档:mysql>help change master to
从库中运行:3308
msyql>CHANGE MASTER TO
MASTER_HOST='192.168.40.137',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=612,
MASTER_CONNECT_RETRY=10;
如何确定 MASTER_LOG_FILE和MASTER_LOG_POS值:
#vim /backup/full330701.sql 找到22行
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=612;
启动专用的复制线程:
msyql>start slave;
CHANGE MASTER TO写错了:
msyql>stop slave;
msyql>resetslave all;
msyql>重新写CHANGE MASTER TO
msyql>start slave;
查看状态:
mysql> show slave status \G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三、主从复制的过程讲解
1、名称认识:
了解相关文件:
主库:
binlog
从库:
relay-log 中继日志
mater.info 主库信息文件
relay-log.info
主从复制之间复制的线程:
主库:
binlog_dump_thread:二进制日志投递线程;
查看方法:
#mysql -S /data/3307/mysql.sock -e "show processlist"
从库:
IO_Thread:从库IO线程 请求和接收binlog
SQL_Thread:从库的SQL线程 回放日志
2、工作原理:
(1)从库执行 change master to语句,将这些主库信息记录到master.info中,master.info存在从库的数据库目录里;
(2)从库执行start slave语句,会立即生产IO_Thread 和SQL_Tread;
(3)IO_Thread读取master.info文件,获取到主库信息;
(4)IO_Tread连接主库,主库会立即分配一个binlog_dump_thread来进行交互;
(5)IO_Tread根据master.info binlog 信息,向binlog_dump_thread请求最新的binlog,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1037,
(6)主库binlog_dump_thread,经过查询,如果发现有新的,截取并返回给从库的IO_Tread;
(7)从库IO_Tread会收到binlog,存储在TCP/IP缓存中,在网络底层返回ACK;
(8)IO_Tread会更新master.info,重置binlog位置点信息,为下次复制设置起点;
(9)从库IO_Tread将binlog,写入到relay-log.info文件,获取上次执行过的位置点;
(10)从库SQL_Tread读取relay-log.info文件,获取上次执行过程的位置点;
(11)SQL_Tread按照位置点往下执行relay-log日志;
(12)SQL_Tread执行完后,重新更新relay-log.info
(13)relaylog定期自动清理的功能;
细节:
主库发生 新的事件,更新二进制日志完成后,会发送一个‘信号’给binlog_dump_thread,binlog_dump_thread通知给IO_Tread。