【MariaDB主从搭建(线上业务不停机)】

原理讲解

主从同步的核心:二进制日志 实现主从同步(主从复制): 1. master将改变的数据记录在本地的二进制日志中(binary log);该过程称之为二进制日志事件 2. slave将master的binary log拷贝到自己的relay log(中继日志)中 3. 中继日志事件,将数据读取到自己的数据库之中

主要信息: 主数据库内网ip:10.0.3.22 从数据库内网ip:10.0.6.6 MariaDB版本为10.1.38

主数据库操作

1、主数据库配置文件修改

# id
#server-id=1
# 二进制日志文件
log-bin=mysql-bin

重启数据库

systemctl restart mariadb

2、创建备份数据库用户

create user backup@localhost identified by backup;
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW, EVENT, TRIGGER, PROCESS ON *.* TO backup@localhost IDENTIFIED BY backup;
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW, EVENT, TRIGGER, PROCESS ON *.* TO backup@10.0.6.10 IDENTIFIED BY backup;
flush privileges;

3、备份所有数据库

time mysqldump --all-databases  -ubackup -pbackup --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

总结:

    要实现点对点的备份恢复,或者对于某点的数据完整备份,必须使用–single-transaction 和–master-data=2两个参数,比如主从搭建时候的,因为在–single-transaction参数中,没可以保证数据备份的备份时间点的事务一致性 –single-transaction备份对于数据库的影响时间比较长,影响范围比较大 ,但是加入该参数后,对于多张大表的备份速度肯定会加快。 –lock-all-tables并不能保持所有数据对于某个时间点的一致性。

4、确定bin_log位置

head -n100 2021-12-13-mysql-all.sql | grep MASTER

查看到的内容: – CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.0292’, MASTER_LOG_POS=366;

5、拷贝到从数据库服务器

scp  2021-12-13-mysql-all.sql root@10.0.6.6:~/

从数据库操作

1、导入备份库

方法一:命令行直接导入

mysql -uroot -p123456 2021-12-13-mysql-all.sql < kuaidaili.sql

方法二:进入数据库使用source命令导入,注意需要登入数据库

source ~/2021-12-13-mysql-all.sql;

2、从数据库授权

change master to master_host=10.0.3.22,master_port=3306,master_user=backup,master_password=backup,master_log_file=mysql-bin.0292,master_log_pos=366;

参数说明: CHANGE MASTER TO MASTER_HOST = ‘10.0.3.22’, #另一台机器的地址 MASTER_PORT = 3306, #另一台机器的端口 MASTER_USER = ‘backup’,#另一台机器上第一步分配的用户名 MASTER_PASSWORD = ‘backup1’, #另一台机器上第一步分配的密码 MASTER_LOG_FILE = ‘mysql-bin.0292’,#另一台机器上执行SHOW MASTER STATUS得到的文件名(File) MASTER_LOG_POS = 366; #另一台机器上执行SHOW MASTER STATUS得到的偏移量(Position)

3、 启动I/O 线程和SQL线程

start slave;

4、 查看从库属性状态

show slave status G;

确保:Slave_IO_Running和Slave_SQL_Running参数都是yes,如果不是yes需要查看下方Last_IO_Error和Last_SQL_Error错误日志

5、遇到的报错处理

Last_SQL_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table mysql.gtid_slave_pos doesnt exist

提示没有这个表:Table ‘mysql.gtid_slave_pos’ doesn’t exist

use mysql;
CREATE TABLE `gtid_slave_pos` (
       `domain_id` int(10) unsigned NOT NULL,
       `sub_id` bigint(20) unsigned NOT NULL,
       `server_id` int(10) unsigned NOT NULL,
       `seq_no` bigint(20) unsigned NOT NULL,
       PRIMARY KEY (`domain_id`,`sub_id`)
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=Replication slave GTID state;
stop slave;
start slave;
show slave statusG;
经验分享 程序员 微信小程序 职场和发展