mariadb故障切换及排错

一、扩展——从服务器提升为主服务器

背景:主服务器突然down机,类似突然停电。这时候就需要提升其他的从服务器为主服务器继续提供对应的服务
1)选择哪一个从服务器来提升?
理论上多个从节点复制不完全一致,我们应该找复制量最多的,同步速度最快的。
分别查看从节点数据库中:show slave status\G 比较其中的一个选项 Exec_Master_Log_Pos: 的数值大小,越大说明数据保留越完整
或者查看每一个从节点中/var/lib/mysq/relay-log.info中的信息也一样。所以从节点服务器选择好了

2)如何提升选择的节点服务器
从服务器一般不启用二进制日志文件,若要提升为主节点服务器,则先把二进制日志文件先启用起来
修改配置文件:vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=# #指定一个日志编号
log-bin
重启数据库服务:systemctl restar mariadb

3)从服务器之前的从节点配置需要重现刷新或者删除
从节点清除信息之前需要停止其线程
进入到数据库里面: stop slave;停止线程
然后在从节点清除信息:reset slave ; #从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log
这个清除从节点信息不完全
如果要彻底清除从节点信息则:reset slave all;#清除所有从服务器上设置的主服务器同步信息,如PORT, HOST, USER和
PASSWORD 等
可以通过 show slave status\G 查看是否清除完全 或者对应其slave的基本信息;如果彻底清除从节点信息,则会显示为空。

4)查看二进制日志是否启动,来判断是否服务起来:
show master logs; 这里的信息就是之后配置其他服务器指向自己之后复制的开始日志二进制文件(很重要)

5)让其他的从节点重新指向提升的主服务器
先进入到从节点的数据库,把线程给停了:stop slave;
然后彻底清除从节点信息:reset slave all;
重新建立从节点change master to:

mariadb故障切换及排错

在其他从服务器数据库中用show slave status\G查看是否配置文件出现,检查是否指向新的主节点服务器
如果指向了,就直接开启线程即可:start slave;
可以查看参数Slave_IO_Running和 Slave_SQL_Running是否连接成功为YES状态

这里需要注意的是否有用户能够进行管理,这里的操作是在刚刚提升为主服务器数据库中操作。
可以通过select user,host from mysql.user 查看
没有的话需要重新创建:

MariaDB [(none)]> grant replication slave on *.* to  "kaivi"@"192.168.32.%" identified by 'centos';

6)最后验证一些是否成功即可

二、故障排错

思路:跳过冲突错误
错误查看:show slave status\G Last_Errno: 1007
Last_Error:xxxxxxxxxxxx

跳过去的方法有多种方法

一种是基于这个事件来跳过
对应有一个变量:sql_slave_skip_counter
第一步在从服务器中停止线程:stop slave;
第二步在从服务器中设置全局变量跳过错误:set global sql_slave_skip_counter=1;
1 表示跳过一个事件,但是不是所有的事件都能跳过,有些重大事件的冲突是跳不过的
第三步,重新启动线程:start slave;
后续的复制不再受影响

mariadb故障切换及排错

第二种方式:
跳过错误编号:Last_Errno: 1007
需要用到一个变量:slave_skip_errors 但是这个变量是静态的,需要修改配置文件
默认是是OFF 不跳过任何错误

mariadb故障切换及排错

mariadb故障切换及排错

三、主服务器非新建时新增从服务器配置

如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点
通过备份恢复数据至从服务器
复制起始位置为备份时,二进制日志文件及其POS
实验环境:
主服务器centos8(192.168.32.8)10.3.11-MariaDB
新增节点服务器(从服务器)(192.168.32.18)10.3.11-MariaDB

主从服务器完全备份配置

主服务上面操作

[root@master ~]#mkdir /backup

[root@master ~]#mysqldump -A -F --single-transaction --master-data=1 > /backup/fullbackup-`date +%F`.sql
在实际生产中需要增加字符集
[root@master ~]#ll /backup/
total 472
-rw-r--r-- 1 root root 479527 Nov 28 17:42 fullbackup-2019-11-28.sql

拷贝到节点服务器(从服务器192.168.32.18)

[root@master ~]#scp /backup/fullbackup-2019-11-28.sql 192.168.32.18:/data/
root@192.168.32.18's password: 
fullbackup-2019-11-28.sql                                                                         100%  468KB  75.8MB/s   00:00    

从服务器上操作

[root@slave ~]#yum install mariadb-server


[root@slave ~]#vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqld]
server-id=18          #server-id用于区别二进制日志文件 这里用IP作为区分号
read-only             #只读 为了安全

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid


[root@slave ~]#systemctl restart mariadb

配置从节点,从完全备份的位置之后开始复制
在配置复制到从节点之前,模拟全备份之后还会有其他的数据库操作

全备份时候的数据查看:
[root@master ~]#mysql
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.000 sec)

模拟全备份后的数据库操作:
MariaDB [(none)]> drop database db1;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> drop database db2;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> create database test.db;
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| testdb             |   #全备份后数据库操作       其中还删除了数据库db1和db2
+--------------------+
4 rows in set (0.000 sec)

全备份迁移

先要查找迁移全备份的位置。

[root@slave ~]#grep -i '^change master to'  /data/fullbackup-2019-11-28.sql
CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;

上面的查询表面在MASTER_LOG_FILE=‘mariadb-bin.000003’, MASTER_LOG_POS=389之后的数据就是全备份之后数据库发生变化的数据。
可以直接在需要导入的全备份数据前面增加如下命令:

[root@slave ~]#vim /data/fullbackup-2019-11-28.sql 

CHANGE MASTER TO
MASTER_HOST='192.168.32.8',
MASTER_USER='kaivi',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;
增加以上的内容。如果这个文件很大,则在数据库中执行这个命令也一样。

mariadb故障切换及排错

进入从服务器数据库,先关闭二进制日志文件,以免产生导入无用日志。

[root@slave ~]#mysql 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.11-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select @@sql_bin_log;
ERROR 1193 (HY000): Unknown system variable 'sql_bin_log'
MariaDB [(none)]> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             1 |
+---------------+
1 row in set (0.000 sec)

MariaDB [(none)]> set sql_log_bin=0;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             0 |
+---------------+
1 row in set (0.000 sec)

MariaDB [(none)]> Ctrl-C -- exit!
Aborted

[root@slave ~]#mysql < /data/fullbackup-2019-11-28.sql   #导入迁移全备份

[root@slave ~]#mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.11-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
                Slave_IO_State: 
                   Master_Host: 192.168.32.8
                   Master_User: kaivi
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000003
           Read_Master_Log_Pos: 389
                Relay_Log_File: mariadb-relay-bin.000001
                 Relay_Log_Pos: 4
         Relay_Master_Log_File: mariadb-bin.000003
              Slave_IO_Running: No
             Slave_SQL_Running: No
               Replicate_Do_DB: 
           Replicate_Ignore_DB: 
            Replicate_Do_Table: 
        Replicate_Ignore_Table: 
       Replicate_Wild_Do_Table: 
   Replicate_Wild_Ignore_Table: 
                    Last_Errno: 0
                    Last_Error: 
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 389
               Relay_Log_Space: 256
               Until_Condition: None
                Until_Log_File: 
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File: 
            Master_SSL_CA_Path: 
               Master_SSL_Cert: 
             Master_SSL_Cipher: 
                Master_SSL_Key: 
         Seconds_Behind_Master: NULL
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 0
                Last_SQL_Error: 
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 0
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
                    Using_Gtid: No
                   Gtid_IO_Pos: 
       Replicate_Do_Domain_Ids: 
   Replicate_Ignore_Domain_Ids: 
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: 
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.000 sec)

可以分析到,这里还是迁移全备份时候数据库的日子,Slave_IO_Running和Slave_SQL_Running两个线程也还没有开启。

开启复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)


MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.32.8
                   Master_User: kaivi
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000003
           Read_Master_Log_Pos: 772
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 940
         Relay_Master_Log_File: mariadb-bin.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: 
           Replicate_Ignore_DB: 
            Replicate_Do_Table: 
        Replicate_Ignore_Table: 
       Replicate_Wild_Do_Table: 
   Replicate_Wild_Ignore_Table: 
                    Last_Errno: 0
                    Last_Error: 
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 772
               Relay_Log_Space: 1251
               Until_Condition: None
                Until_Log_File: 
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File: 
            Master_SSL_CA_Path: 
               Master_SSL_Cert: 
             Master_SSL_Cipher: 
                Master_SSL_Key: 
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 0
                Last_SQL_Error: 
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 8
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
                    Using_Gtid: No
                   Gtid_IO_Pos: 
       Replicate_Do_Domain_Ids: 
   Replicate_Ignore_Domain_Ids: 
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 3
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 0
1 row in set (0.000 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
4 rows in set (0.000 sec)

数据库以及同步,删除了db1和db2.创建了新的testdb库。

测试是否同步

mariadb故障切换及排错

mariadb故障切换及排错

上一篇:mysql在Linux(CentOS)上安装


下一篇:千亿级数据平滑扩容之数据库平滑扩容实现