暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第九章 主从复制

蜜蜂点滴 2020-06-11
103

--------上节回顾--------

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。


















文章转载自蜜蜂点滴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论