mysql、mariadb配置主从备份

时间:2024-03-16 16:27:55

配置主服务器

1.更改配置文件,首先检查你的主服务器上的my.cnf文件中是否已经在[mysqld]模块下配置了log-bin和server-id
mysql、mariadb配置主从备份
注意上面的log-bin和server-id的值都是可以改为其他值的(server-id建议修改为ip地址最后一位),如果没有上面的配置,首先关闭mysql服务器,然后添加上去,接着重启服务器

2.创建用户,每一个从服务器都需要用到一个账户名和密码来连接主服务器,可以为每一个从服务器都创建一个账户,也可以让全部服务器使用同一个账户。下面就为同一个ip网段的所有从服务器创建一个只能进行主从同步的账户。

mysql> insert into mysql.user(Host,User,Password) values("%","rep",password("123456"));

这样就创建了一个名为:rep 密码为:123456的用户。
3.导入导出主从数据。

将主数据库的数据导出后导入到从数据库。

然后执行下面的语句获取二进制日志的信息

mysql > show master status;

mysql、mariadb配置主从备份

File的值是当前使用的二进制日志的文件名,Position是该日志里面的位置信息(不需要纠结这个究竟代表什么),记住这两个值,会在下面配置从服务器时用到。

注意:如果之前的服务器并没有配置使用二进制日志,那么使用上面的sql语句会显示空,配置log-bin和server-id后重启就可以了。

配置从服务器

首先检查从服务器上的my.cnf文件中是否已经在[mysqld]模块下配置leserver-id

配置同步参数,登陆mysql,输入如下信息:

mysql、mariadb配置主从备份
启动主从同步进程

mysql > start slave;

检查状态

mysql > show slave status \G

mysql、mariadb配置主从备份
若执行start slave 时报告一下错误;

Slave failed to initialize relay log info structure from the repository

解决方案:

mysql>  reset slave;
Query OK, 0 rows affected (0.04 sec)

mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.07 sec)

mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.10 sec)

mysql> start slave;
Query OK, 0 rows affected (0.20 sec)

mysql> show slave status\G

常见问题:

1、show slave status中Slave_IO_State: Waiting to reconnect after a failed registration on master

解决方法:

在master上执行

grant replication slave on . to ‘repl’@’%’ identified by ‘password’;

FLUSH PRIVILEGES;

然后重新stop slave 和start slave就可以

2、show slave status中Slave_IO_Running: No

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决办法:每个库的uuid应该是不一样的,修改auto.cnf文件(在mysql 的data目录下)的uuid:

[auto]

server-uuid=6dcee5be-8cdb-11e2-9408-90e2ba2e2ea6

按照这个16进制格式,随便改下,重启mysql即可。

3、从库中slave_sql_running为NO

一般在 Last_SQL_Error:项中可以看到报错的语句

Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件

Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

这时,网上很多会教使用SET global sql_slave_skip_counter=n; 设置,但其实执行这个语句都会报错,因为启动了gtid-mode=ON

解决方法:跳过执行报错的语句

查看show slave status的最后两行:

Retrieved_Gtid_Set表示已经从master中拉取过来的事务;

Executed_Gtid_Set表示已经执行的事务

找到Executed_Gtid_Set中与Retrieved_Gtid_Set ID一致的记录,如上图ca83d308-2ea5-11e4-b85f-00163e042f50:1-5,表示只执行到第五个事务,就是这个事务报错了,因此跳过这个事务即可。依次执行以下语句:

stop slave;

set gtid_next=‘ca83d308-2ea5-11e4-b85f-00163e042f50:6’;

begin;commit;

set gtid_next=“AUTOMATIC”;

start slave;

然后再查看show slave status\G

如果看到以下状态即可以了

PS:启动主从备份时,一定要确保主从的数据一致,因为从库遇到任何报错,即使执行update语句时,主库中的一条记录在从库中找不到,都会报导致问题2的出现,从而停止执行slave更新