MySQL主从复制日常管理维护篇
日常工作中,我们需要经常进行一些监控和管理维护工作,以便能及时发现一些复制中的问题,并尽快解决,以此来保证复制能够正常工作
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主从复制日常管理维护篇的更多相关文章
- 【0.3】mysql复制的日常管理维护,mysql复制常见问题处理
[1]复制的日常管理 #复制的日常管理与维护 [1.1]show slave status\G :在从库查看从库线程状态 [1.2]flush tables with read lock; :主从不 ...
- MySql的日常管理
连接故障恢复 MySQL套接字被误删 在UNIX系统上,本地客户以localhost为主机名建立MySQL连接,该过程是通过一个UNIX套接字文件(比如说,/tmp/mysql.sock文件)实现的. ...
- MySQL复制日常维护与管理
一.复制一些常见设置 1.mysql复制启动时参数: mysql启动时的参数包括:master_host,master_port,master_user,master_password,master_ ...
- 5. MGR管理维护 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 切换主节点 2. 切换单主/多主模式 3. 添加新节点 4. 删除节点 5. 异常退出的节点重新加回 6. 重 ...
- MySQL Cluster 日常维护
在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...
- 高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离
实战操作可参考:http://www.roncoo.com/course/view/3117ffd4c74b4a51a998f9276740dcfb 一.环境 操作系统:CentOS-6.6-x86_ ...
- 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...
- 分布式架构高可用架构篇_08_MyCat在MySQL主从复制基础上实现读写分离
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 看完这篇还不懂 MySQL 主从复制,可以回家躺平了~
大家好,我是小羽. 我们在平时工作中,使用最多的数据库就是 MySQL 了,随着业务的增加,如果单单靠一台服务器的话,负载过重,就容易造成宕机. 这样我们保存在 MySQL 数据库的数据就会丢失,那么 ...
随机推荐
- 合并两个数组并去重(ES5和ES6两种方式实现)
合并两个数组并去重(ES5和ES6两种方式实现) ES6实现方式 let arr1 = [1, 1, 2, 3, 6, 9, 5, 5, 4] let arr2 = [1, 2, 5, 4, 9, 7 ...
- deque双端队列(常用方法总结)
/*关于C++ STL中deque的学习*/ #include<cstdio> #include<iostream> #include<deque> using n ...
- Pycharm---新建文件时 自动添加作者时间等信息
可用的变量有: $ {PROJECT_NAME} - 当前项目的名称. $ {NAME} - 在文件创建过程中在“新建文件”对话框中指定的新文件的名称. $ {USER} - 当前用户的登录名. $ ...
- 亲身实践 yui-compressor压缩js和css
最近很懒散,个人感情.家庭原因,没有动力去学东西,老是发誓要搞好前端工程化,老中断,唉!没有魄力! 最近老觉得这前端工程化有什么好的,东西那么多,还得学!直到前几天产品提了个优化,说搜索结果页跳商品详 ...
- 下拉加载更多DEMO(js实现)
项目的一个前端页面展示已购买商品时,要求能下拉加载更多.花了点时间研究这个功能,以前没做过. 首先需要给div加scroll事件,监听滚动条滚动动作.那何时触发加载动作呢?当滚动条滚到底的时候.如何判 ...
- 当堆遇到STL 代码焕发光芒
来自度娘的释义,堆的含义大概是这样的: 感性理解: 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于 ...
- 使用ajax请求SpringMVC返回Json出现乱码解决方法
1:在使用ajax请求后台访问数据的数据,后台返回的数据是乱码,带??问号的乱码,之前还一直没有遇到过,在这里记录整理一下,贴出解决代码! (1):前台使用ajax ,已经设定返回的结果为json格式 ...
- 数据结构与算法--最小生成树之Kruskal算法
数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...
- Idea无法运行Maven项目
导入项目到tomcat的时候要选择Arifact 如果maven项目没有这个选项, <groupId>com.bihang</groupId> <artifactId&g ...
- js文字滚动效果
function (global) { var logo = document.getElementById('logo'); var text = document.createTextNode(' ...