日常工作中,我们需要经常进行一些监控和管理维护工作,以便能及时发现一些复制中的问题,并尽快解决,以此来保证复制能够正常工作

1、查看从库状态

MySQL [(none)]> show slave status\G
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.31.22.29
Master_User: chaofeng
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos:
Relay_Log_File: ip-----relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
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:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
Master_UUID: ce15f67e-0ccc-11e9-9e0a-0af74ce261dc
Master_Info_File: /data/data_mysql/master.info
SQL_Delay:
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count:
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position:
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
row in set (0.00 sec)

上面所有的信息中,我们只需要关注上面背景为蓝色的两行信息,即“SQL_IO_Running”和"Slave_SQL_Running"这两个状态是否为“YES”,必须两个都是“YES”,说明主从复制没有问题。只要其中有一个不是“YES”,那么主从复制就有问题。

2、主从库同步维护

这个是说主从复制中由于某些原因从库的数据总是滞后于主库,这时候就需要我们手动定期的进行主从库的数据同步了,使得主从数据差距能够减到最小。常用的方法就是:在负载较低时暂时阻塞主数据库的更新,强制主从数据库更新同步。

方法步骤:

1、在主库上执行读锁操作(这是会阻塞主数据库的所有更新操作)

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, rows affected (0.01 sec) mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin. | | | | |
+------------------+----------+--------------+------------------+-------------------+
row in set (0.00 sec)

记住上面的这两个数值,file的二进制文件名字,Position的数值154。这个数值是从库复制的目的坐标。

2、在从库上,执行MASTER_POS_WAIT函数

MySQL [(none)]> select MASTER_POS_WAIT('mysql-bin.000002','');
+-------------------------------------------+
| MASTER_POS_WAIT('mysql-bin.000002','') |
+-------------------------------------------+
| |
+-------------------------------------------+
row in set (0.00 sec)

这个select语句会阻塞直到从库达到指定的日志文件和偏移量后,返回0,如果返回-1,则表示超时退出。

3、最后在主库上,执行解锁操作,使其能够进行读写操作。

mysql> UNLOCK TABLES;
Query OK, rows affected (0.00 sec)

3、从库复制出错的处理

某些情况下,会出现从库更新失败,这时,需要确定一下是否是从库与主库的表的不同造成的。如果不是的话,我们需要研究一下SQL_SLAVE_SKIP_COUNTER这个变量的意义了。

4、从库报错:log event entry exceeded max_allowed_packet的处理

一般主从复制中,主库上的表的含有BLOG列或长字符串的时候,在从库上恢复数据时可能会报上面的这个错误。这是因为含有打文本的记录无法通过网络传输导致,解决的方法就是在主从库上增加max_allowed_packet参数的大小,这个参数默认值为1MB,我们可以根据实际情况来进行设置。

mysql> show variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | |
+--------------------+----------+
row in set (0.01 sec) mysql> set global max_allowed_packet=;
Query OK, rows affected (0.00 sec)

尽量在my.cnf文件也设置好,下次启动可以及时生效。

5、主主复制时的自增长变量冲突问题。

双主架构多用于运维人员做维护等需要主从切换的场景,通过双主架构避免了重复搭建从库的麻烦。

不过主主复制的缺点就是如果主库的表采用自动增长变量,那么复制到从库的同一张表后很可能会引起主键冲突。因此我们就需要定制auto_increment_increment和auto_increment_offset的设置,保证多主之间不会有重复冲突。我们看一下这两个变量的作用:

mysql> set  @@auto_increment_increment=;
Query OK, rows affected (0.00 sec) mysql> set @@auto_increment_offset=;
Query OK, rows affected (0.00 sec) mysql> show variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | |
| auto_increment_offset | |
+--------------------------+-------+
rows in set (0.00 sec)

接下来我们看看结果:

mysql> create table haha ( id int auto_increment,primary key(id));
Query OK, rows affected (0.02 sec) mysql> insert into haha values (null),(null),(null);
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> select * from haha;
+----+
| id |
+----+
| |
| |
| |
+----+
rows in set (0.00 sec)

再来设置一个偏移量:

mysql> set @@auto_increment_increment=;
Query OK, rows affected (0.00 sec)
mysql> set @@auto_increment_offset=;
Query OK, rows affected (0.00 sec) mysql> show variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | |
| auto_increment_offset | |
+--------------------------+-------+
rows in set (0.00 sec) mysql> insert into haha values (null),(null);
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: mysql> select * from haha;
+----+
| id |
+----+
| |
| |
| |
| |
| |
+----+
rows in set (0.00 sec)

从上面的例子可以看出来,我们通过这两个参数可以方便地设置不同的主库上的自动增长列的值的范围,这样子在这些数据复制到从库上我们可以有效地避免主键的重复。

在多主上,比如这里有两个master,我们可以这样子设置

Master1上:auto_increment_increment = 2,auto_increment_offset = 2;(2,4,6,8,10.....)
Master2上:auto_increment_increment = 2,auto_increment_offset = 1;(1,3,5,7,9......)

大家记住一句:auto_increment_offset表示我们设置的序号是从哪个数值开始的。(这个数值最好不超过auto_increment_increment)。而auto_increment_increment表示我们自动增长的键依次增加的数值

6、查看从库的复制进度。

通过查看从库的复制进度,我们可以判断出来是否需要我们手工进行主从的同步工作等等。

我们主要是获取从库上的time值,这个值记录了从库当前执行的SQL时间戳与系统时间之间的差距,单位是秒。比如下面这个:

*************************** . row ***************************
Id:
User: system user
Host:
db: NULL
Command: Connect
Time:
State: Slave has read all relay log; waiting for more updates
Info: NULL

由于MySQL复制的机制是执行主库传输过来的二进制日志,二进制日志中的每个语句通过设置时间戳来保证执行时间和顺序的正确性,所以每个语句执行之前都会设置时间戳,而通过查询这个进程的time就可以知道最后设置的时间戳和当前时间的差距。

7、

MySQL主从复制日常管理维护篇的更多相关文章

  1. 【0.3】mysql复制的日常管理维护,mysql复制常见问题处理

    [1]复制的日常管理 #复制的日常管理与维护 [1.1]show slave status\G :在从库查看从库线程状态 [1.2]flush tables with read lock;  :主从不 ...

  2. MySql的日常管理

    连接故障恢复 MySQL套接字被误删 在UNIX系统上,本地客户以localhost为主机名建立MySQL连接,该过程是通过一个UNIX套接字文件(比如说,/tmp/mysql.sock文件)实现的. ...

  3. MySQL复制日常维护与管理

    一.复制一些常见设置 1.mysql复制启动时参数: mysql启动时的参数包括:master_host,master_port,master_user,master_password,master_ ...

  4. 5. MGR管理维护 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 切换主节点 2. 切换单主/多主模式 3. 添加新节点 4. 删除节点 5. 异常退出的节点重新加回 6. 重 ...

  5. MySQL Cluster 日常维护

    在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...

  6. 高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

    实战操作可参考:http://www.roncoo.com/course/view/3117ffd4c74b4a51a998f9276740dcfb 一.环境 操作系统:CentOS-6.6-x86_ ...

  7. 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

    一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...

  8. 分布式架构高可用架构篇_08_MyCat在MySQL主从复制基础上实现读写分离

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  9. 看完这篇还不懂 MySQL 主从复制,可以回家躺平了~

    大家好,我是小羽. 我们在平时工作中,使用最多的数据库就是 MySQL 了,随着业务的增加,如果单单靠一台服务器的话,负载过重,就容易造成宕机. 这样我们保存在 MySQL 数据库的数据就会丢失,那么 ...

随机推荐

  1. golang三方包应该如何安装--在线和离线

    一 在线安装 采用go get的方式安装import 的时候找不到对应的包看看pkg里面有没有 二 离线安装 redis客户端采用git clone的方法安装的话可以用以下方法 cd src git ...

  2. SpringBoot学习(一)——Spring的发展

    一.Spring1.x时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在Java类和xml配置文件中切换. 二.S ...

  3. (转)Java多线程学习(吐血超详细总结)

    本文转自:http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能 ...

  4. What is AMQP? and the architecture

    What is AMQP? (Advanced Message Queuing Protocol) When two applications need to communicate there ar ...

  5. 写个OAuth2.0的请求端来测试自己的OAuth2.0服务端(二)

    在上一篇文章中,我们介绍了怎么创建自己的服务器,现在我们开始写个client端,来测试. 我们创建一个MVC项目,叫TestOAuthClient 1. 代码开始 1)第一步,我们创建一个MainCo ...

  6. WebApi实现单个文件的上传下载

    上传和下载是很常用的功能了,只有当用到的时候才发现不会写...,经过一番百度.筛选.整理修改后,实现了功能,下面简单的记录下实现方法. 一.上传功能 1.前端代码 上传文件 <input typ ...

  7. 微信小程序看上去很美

    目前不少关于 微信小程序 的文章主要集中在两各方面:一是开发技术细节:二是怎么靠此赚钱. -- “微信小程序”所处的环境 -- 2016年初,美国号召全民学编程,包括监狱服刑人员.同样,在中国要想掌握 ...

  8. Java基础之多态性

    class A { public void fun1(){ System.out.println("A--->public fun1()"); } public void f ...

  9. springboot中使用mybatis之mapper

    Spring Boot中使用MyBatis传参方式:使用@Param@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})& ...

  10. java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)

    global.gradle版本配置文件 原配置 compile_sdk_version = 26 build_tools_version = '26.0.2' target_sdk_version = ...