Mysql的主从同步一直只停留在了解的表面上,以后或许用的到,所以准备实践下,大概学习了下同步的原理.
一 Mysql主从同步原理
Mysql的同步原理比较简单. 主服务器打开binlog日志,从服务器通过IO线程从主服务器上读取binlog日志保存为中继日志,从服务器的SQL线程再回放日志,应用到从服务器上,从而实现数据的同步.
如下图:
简单来说:
- 先建立账号, 用于数据的同步;
- 锁定主库,目的是防止主库修改,这时候进行全量的数据备份,将备份的数据在备份库恢复.
- 开启binlog日志,解锁主库.
- 这时候在主库上的操作会记录在binlog日志中.
- 我们在从库上设置好同步的主库信息,从库上的IO线程拉取binlog日志
- 从库上回放binlog日志,这样就达到了从库同步主库的目的了.
二 实践
2.1 安装mariadb 【会存在同步问题】
条件首先有两台Mysql服务器. 我先安装吧,用的机器的系统是centos7.5的,默认的yum源安装的mariadb版本是5.x的,想安装最新的,配置下阿里源:
cd /etc/yum.repos.d
vim MariaDB.repo
添加以下内容
[mariadb]
name=MariaDB
baseurl=http://mirrors.aliyun.com/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
更新源缓存:
···
yum clean all
yum makecache
···
安装Mariadb数据库:
yum install MariaDB-server MariaDB-client
启动数据库:
systemctl start mariadb #启动服务
设置开机启动
systemctl enable mariadb
systemctl 常用命令:
systemctl enable mariadb #设置开机启动
systemctl restart mariadb #重新启动
systemctl stop mariadb.service #停止MariaDB
设置密码:
mysql_secure_installation
这里面首先要输入root原来的密码,即空的,直接打入回车,然后输入两次root密码,并删除些test数据库,禁止远程登录root等。
2.2 主数据库配置
新建用户和授权:
CREATE USER 'slave1'@'localhost' IDENTIFIED BY '1ABCqwe345^';
update user set host='%' where user='slave1';
grant replication slave on *.* to 'slave1'@'%';
flush privileges;
开启binlog日志:
vim /etc/my.conf
[mysqld]
server-id=1
log-bin="master-bin"
重启数据库:
service mysqld restart
导出数据库备份:
mysqldump -uroot -p --single-transaction --flush-logs --master-data --all-databases > all.sql
2.3 从库配置参数
[mysqld]
server-id = 2
#read_only = 1
#relay_log = /var/log/mariadb/relay.log
replicate-do-db=xxx
replicate-do-db=yyy
说明:
relay_log 配置中继日志
log-slave-updates 表示slave将复制事件写进自己的二进制日志,简单地说,如果从库同时作为其它库的主库,那么需要添加该参数,否则不需要
read_only 它防止改变数据
replicate-do-db 要同步的数据库
加载数据库文件
mysql -uroot -p
xxx
mysql > source /root/all.sql
在主数据库上执行(这一步在主导出数据库后就执行)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 | 155 | | | |
+-------------------+----------+--------------+------------------+-------------------+
在从服务器上设置同步参数:
mysql>change master to master_host='47.xx.xx.xx',master_user='slave1',master_password='1ABCqwe345^',master_log_file='master-bin.000002',master_log_pos=155;
mysql>start slave;
查看同步结果:
mysql> show slave status;
后面发现有问题,主是mysql的8.0.x版本,从是mariadb的版本,换下:
重新安装mysql8的版本:
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum install mysql80-community-release-el7-3.noarch.rpm
yum install yum-utils -y
yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql80-community
yum install mysql-community-server
#启动
systemctl start mysqld
#查密码
[root@VM-0-2-centos lib]# grep 'temporary password' /var/log/mysqld.log
2021-07-25T07:31:53.643365Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: mmlS;r&O!2aq
#mysql -uroot -p
#ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
再次按照上述同步设置:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 47.xx.xx.xx
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 155
Relay_Log_File: VM-0-2-centos-relay-bin.000004
Relay_Log_Pos: 372
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mdpt,lms
Replicate_Ignore_DB:
Replicate_Do_Table:
终于同步好了,测试下,结果的ok的。这记录的是很基础的东东,同步还有异步同步,半同步等多种方式,同步的参数也有很多,这里面就节省了。
但是这里面有个重要问题,就是如果主的数据被删除,数据立刻同步到备数据库,失去了意义,我们如果只是做备份,对数据的实时性并没有什么要求,可以设置以下命令:
在从数据库下执行:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> CHANGE MASTER TO master_delay = 3600;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
这样从数据库就延迟1个小时从主数据库同步数据,好处是防止主数据的误删除。
如果要保证数据的一致性和crash safe,可以添加如下配置:
gtid_mode = on
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1
relay_log_recovery = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
不过没尝试过。
三 参考
mysql安装
mysql主从同步
四 诗词欣赏
# 兰亭集序
[【作者】王羲之 ] 【朝代】魏晋
永和九年,岁在癸丑,暮春之初,会于会稽山阴之兰亭,修禊事也。
群贤毕至,少长咸集。
此地有崇山峻岭,茂林修竹,又有清流激湍,映带左右,引以为流觞曲水,列坐其次。
虽无丝竹管弦之盛,一觞一咏,亦足以畅叙幽情。
是日也,天朗气清,惠风和畅。仰观宇宙之大,俯察品类之盛,所以游目骋怀,足以极视听之娱,信可乐也。
夫人之相与,俯仰一世。
或取诸怀抱,悟言一室之内;或因寄所托,放浪形骸之外。
虽趣舍万殊,静躁不同,当其欣于所遇,暂得于己,快然自足,不知老之将至;及其所之既倦,情随事迁,感慨系之矣。
向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀,况修短随化,终期于尽!古人云:“死生亦大矣。”岂不痛哉!
每览昔人兴感之由,若合一契,未尝不临文嗟悼,不能喻之于怀。固知一死生为虚诞,齐彭殇为妄作。后之视今,亦犹今之视昔,悲夫!故列叙时人,录其所述,虽世殊事异,所以兴怀,其致一也。后之览者,亦将有感于斯文。