SlideShare a Scribd company logo
1 of 15
Download to read offline
MySQL数据库生产环境维护



 整理者:金官丁
 网 站:ww.mysqlops.com
大纲内容

   表对象的DDL
   表数据的DML
   复制
   Heartbeat的VIP漂移




                www.mysqlops.com
表对象的DDL变更

   增加字段的注意事项
   DDL加速技巧
   M-M架构的DDL变更技巧
   其他建议




               www.mysqlops.com
增加字段注意事项
      增加字段必须要有默认值
例如:
ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’;

      增加的字段不能指定字段顺序,必须默认尾部增加模式
例如:增加一个字段到表对象的头部

ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0 FIRST;

备注:这是我们强烈发对的行为,可能导致需要更多时间用于数据重整,以及对复制可能造成数据错乱

应该写成:ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;

      建议表设计都设置为NOT NULL 且默认值
非NULL且有默认值的字段属性,有利于提高数据比对检索的性能,更加有利于索引结构的优化

      同一表增加多个字段,不分多条语句,而应只用一条变更语句
例如:

ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;

ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’;

应该改写成:

ALTER TABLE tmp_test

          ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0,

          ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00';
DDL加速技巧
   DDL操作的过程
①   申请表对象加锁,只允许读不允许更新

②   复制一份变更对象表的结构代码

③   原数据结构基础之上修改,新建一组临时文件,MyISAM引擎和InnoDB引擎的文件有所不同,
    分别为: #***.frm、#***.MYD、#***.MYI, #***.frm、#***.ibd

④   变更对象表中的数据写入到临时表中

⑤   速度读写完毕的情况下,完全锁定被变更的表,并且删除被变更表

⑥   对临时文件执行RENAME操作

⑦   刷新数据字典信息

⑧   释放锁




   调整的SESSION变量
①   建议增加SESSION级别的 sort_buffer_size 值,以加速DDL过程需要做的排序操作;

②   建议增加SESSION级别的 read_buffer_size 值,增加顺序读的速度;

③   建议增加SESSION级别的 tmp_table_size 和 max_heap_table_size值,增加内存缓存数据的能力;

④   若是存在InnoDB引擎转MyISAM的操作,建议在线增加key_buffer_size的值,增加索引数据的缓存能力;

                               www.mysqlops.com
M-M架构的DDL变更技巧
   M-M 复制架构,只有一台提供全部或主数据服务
推荐DDL语句,在当下M-M架构中属于备用数据库服务器上优先执行,有四项优点:

①   不立即影响数据库提供的 数据服务

②   不阻塞主备之间数据复制的日志恢复操作

③   DDL语句执行过程,若出问题只影响备库的稳定性,而很少会影响主库

④   若有数据服务无缝切换功能(例如:heartbeat、自主数据层等),可以在备库执行完成后,进行数据服务
    提供的主备库切换,尤其是数据容量大的表变更时,可以减少对业务影响程度及减少停机维护时间和次数

   M-M-multiS复制架构




针对双主复制,外加多从模式,就要分操作类型进行了,一般原则:线上环境不删除字段,修改为兼容性的属性,

为此针对此类操作我们建议:

①   IP:10.10.1.124也即中转兼备用服务器上,先执行SET sql_log_bin=0; 然后执行DDL变更;

②   待上一步骤完成,再在对应的只读性质的丛库上执行DDL变更;

③   待上述步骤都正常完成,再在IP:10.10.1.123服务器上执行SET sql_log_bin=0; 然后执行DDL变更;
                        www.mysqlops.com
其他事项
   索引优化命令执行顺序和坚持的原则:

①   优先执行创建索引的语句;

②   确保增加了对应的索引结构之后,再删除多余的索引;

③   用户行为触发而执行频率越高的SQL命令,性能确保其性能最佳;

④   数据变更类型(UPDATE OR DELETE)的SQL命令,索引可选择性优先;

   数据库对象表结构的变更
①   若是增加字段或字段属性值域扩大等类似操作,必须优先于应用程序发布;

②   若是字段的删除操作,则等应用程序成功发布之后再执行;

③   若是字段类型变更,不兼容的情况下,则与版本发布同一时间段内完成(注:一般是停机维护类型);

④   若是涉及索引的变更,则先于应用程序发布进行增加,等应用程序成功发布上线之后,再删除多余的索引。




                        www.mysqlops.com
数据库对象表数据的DML
   DML语句书写建议
   大数据量的DELETE OR UPDATE
   定期规律性清理数据的DELETE
   M-M架构的大数据量DML技巧




                 www.mysqlops.com
DML语句书写建议
      DML语句不允许出现@number方式替代字段名称

不合理的写法:UPDATE table_name SET @1=NOW() WHERE @2=1;

正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;

      UPDATE OR DELETE 禁用LIMIT子句

不合理的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1 LIMIT 1;

正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;

      INSERT语句需要写清楚值和字段对应关系

不合理的写法:
INSERT INTO table_name VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));

正确的写法:
INSERT INTO table_name(gmt_create,gmt_modify) VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));

      DML语句少用不确定性函数

常见被大家使用的不确定性函数:UUID()、RAND()、SYSDATE()等函数,若无特殊用处之外,请以确定性函

数替代之。



推荐阅读的技术文章:曾用于内部培训的PPT内容:MySQL开发规范与实用技术交流
                                           www.mysqlops.com
大数据量的DELETE OR UPDATE

    可能出于某些原因和运营目的,需要对数据库中的数据进行大量的清理或更改某字段的值,分别举

二个示例:

①    网络专项整治的时期,需要删除大量含某些关键词的内容;

②    给符合某一条件(例如:等级,在线时长)的游戏玩家,赠送100~1000不等数量的游戏币;



    给出的2个数据修改需求示例,若是直接根据相关要求去做,一个是需要用到模糊查询,另一个数据

更新条件也没有合理索引可用,为此可能造成表对象表级锁被长时间锁住,而且阻塞其他更改类型数据操作

服务,所以我们不得不采用更合理的办法,建议如下步骤解决:

①    设计并创建一张表tmp_pk_data ,用于记录将要被修改记录的主键,及需要的相关信息;

②    优先考虑在备库上跑一条SQL命令或存储过程的方式,把主键及相关数据写到表tmp_pk_data中;

③    编写一个存储过程,使用游标循环控制获得tmp_pd_data的信息,根据主键更新或删除目标表的数据,
     且建议此操作在备库上完成(注释:必须是双主复制模式,才可在备库上执行);




                      www.mysqlops.com
定期规律性清理数据的DELETE

    定期规律性数据的清理,优先对目标表的数据操纵方式进行分类:

①    若是日志类型的数据,则完全可以改为借助分区表的方式,比如按日期删除数据的条件,则可
     以用日期作为数据分区条件,然后增删分区的方式实现数据的清理工作;

②    若是数据的UPDATE/DELETE/SELECT操纵条件,与定期清理数据的规则一致或被其包含,则
     可以考虑使用分区表,然后借助删除分区方式达到数据清理的目标;

③    若不能使用分区表解决的,则可以考虑参考上章节介绍的“大数据量的DELETE OR UPDATE”
     内容;




                      www.mysqlops.com
M-M架构的大数据量DML技巧
    日常工作中,可能偶尔会碰到非常紧急的大数据量订正工作,数据更新的条件也非常简单,还可能有合

理的索引使用。若是采用M-M复制架构,则可以考虑优先在备库上执行此操作,至少可以做到:

①    不阻塞数据复制的恢复线程;

②    若存在数据服务无缝切换机制,可选择备库执行完毕,立即切换主备的数据服务,减少对应用的影响;

③    采用前面章节介绍的方法,先通过查询语句把数据写入对应的表中,再根据主键更新或删除,也可以
     考虑在备库上执行,减少数据复制的恢复负载压力,通过复制的方式去更新主库上的数据,稍微要承
     担一点数据被覆盖的风险;

④    要向数据库中导入大量数据,建议对导入的数据文件先进行切割成相对合理的数据量,接着优先在备
     用服务器上进行导入,而不应该选择直接主库上进行,而是通过MySQL自身的复制功能,同步到主数
     据库服务器上;




                     www.mysqlops.com
异步复制
    replicate-ignore-db复制模式的注意事项
    数据更新或数据结构变更的时候,必须先执行USE db_name的方式,到目标数据库对象内再执行

其他SQL语句,禁用类似:INSERT INTO db_name.tablename……语句

    sql_log_bin
    MySQL5.1及以上版本支持参数:sql_log_bin,可以设置SET SESSION sql_log_bin=0的方式,达到

修改类型的SQL语句操作不会登记到二进制日志文件中,从而可以达到不会被复制到其备库上,为解决少

量主备数据不一致、复制中断,以及特殊的数据更改或数据结构变更等应用场景提供了方便;

    sql_slave_skip_counter
    用于跳过出错的SQL语句数量设置的参数,某些紧急情况或可忽略的错误,则可以借助此参数先恢复

复制的正常运行,步骤:

①    STOP SLAVE;

②    SET GLOBAL sql_slave_skip_counter=N     注释:N为跳过SQL的个数,不建议盲目跳

③    START SLAVE;

推荐阅读的技术文章:生产环境搭建MySQL复制的教程

                                  www.mysqlops.com
Heartbeat的VIP漂移

    前端应用配置的数据库连接为VIP,而VIP服务由Heartbeat软件实现,且数据库架构采用M-M架构,

为实现快速切换,可采用的步骤(假设A<->B,VIP加载在A主机上):

①     停掉A物理服务器上的Hearbeat服务:service heartbeat stop

②     检查VIP服务是否漂浮到B主机上,以及前端程序是否连接上来

③     检查是否恢复完从A主机复制过来的日志,及主备复制是否正常

④     关闭A主机上的mysqld服务:mysqladmin –uroot –p**** shutdown

⑤     启动A主机上的Heartbeat服务启动: service heartbeat stop

⑥     启动A主机上的mysqld服务:mysqld_safe &




推荐阅读的技术文章:

MySQL DBA变更规范

HeartBeat搭建MySQL数据库双主热备高可用环境




                               www.mysqlops.com
会持续整理一系列对MySQL DBA工作,有帮助的技术
资料和经验分享,也会告诉大家工作中,以什么样的心态和
心境对待技术工作,让我们大家一起分享,一起成长!

  便于大家及时接收到相关信息,请关注我们的微博或网
站,感谢您们一路的陪伴!

备注:mysql5.5版本的参数信息,将单独整理

新浪微博:http://weibo.com/mysqlops
腾讯微博:http://t.qq.com/mysqlops

邮箱地址:mysqlops@sina.com


                  www.mysqlops.com

More Related Content

What's hot

Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1小新 制造
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
百度分布式数据实践与进展
百度分布式数据实践与进展百度分布式数据实践与进展
百度分布式数据实践与进展yp_fangdong
 
淺談 Ado.net
淺談 Ado.net淺談 Ado.net
淺談 Ado.netGelis Wu
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance managementted-xu
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recoveryted-xu
 
P6 数据库安装和配置
P6 数据库安装和配置P6 数据库安装和配置
P6 数据库安装和配置epst
 
Oracle使用者安全設定
Oracle使用者安全設定Oracle使用者安全設定
Oracle使用者安全設定Chien Chung Shen
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rmanted-xu
 
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gOracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gChien Chung Shen
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 
Mysql性能分析之临时表(共享)
Mysql性能分析之临时表(共享)Mysql性能分析之临时表(共享)
Mysql性能分析之临时表(共享)beiyu95
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuningted-xu
 

What's hot (17)

Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
百度分布式数据实践与进展
百度分布式数据实践与进展百度分布式数据实践与进展
百度分布式数据实践与进展
 
淺談 Ado.net
淺談 Ado.net淺談 Ado.net
淺談 Ado.net
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
Oracle SGA 介紹
Oracle SGA 介紹Oracle SGA 介紹
Oracle SGA 介紹
 
P6 数据库安装和配置
P6 数据库安装和配置P6 数据库安装和配置
P6 数据库安装和配置
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Oracle Instance 介紹
Oracle Instance 介紹Oracle Instance 介紹
Oracle Instance 介紹
 
Oracle使用者安全設定
Oracle使用者安全設定Oracle使用者安全設定
Oracle使用者安全設定
 
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
 
Oracle 索引介紹
Oracle 索引介紹Oracle 索引介紹
Oracle 索引介紹
 
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gOracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 
Mysql性能分析之临时表(共享)
Mysql性能分析之临时表(共享)Mysql性能分析之临时表(共享)
Mysql性能分析之临时表(共享)
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 

Viewers also liked

ORACLE DBA原地满血华丽变身MYSQL DBA
ORACLE DBA原地满血华丽变身MYSQL DBAORACLE DBA原地满血华丽变身MYSQL DBA
ORACLE DBA原地满血华丽变身MYSQL DBABeenyoung Lee
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧samon127
 
Oracle的闪回特性
Oracle的闪回特性Oracle的闪回特性
Oracle的闪回特性Beenyoung Lee
 
数据库部门介绍
数据库部门介绍 数据库部门介绍
数据库部门介绍 mysqlops
 
Mysql性能监控实践报告 by junsansi
Mysql性能监控实践报告   by junsansiMysql性能监控实践报告   by junsansi
Mysql性能监控实践报告 by junsansiBeenyoung Lee
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事mysqlops
 

Viewers also liked (6)

ORACLE DBA原地满血华丽变身MYSQL DBA
ORACLE DBA原地满血华丽变身MYSQL DBAORACLE DBA原地满血华丽变身MYSQL DBA
ORACLE DBA原地满血华丽变身MYSQL DBA
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧
 
Oracle的闪回特性
Oracle的闪回特性Oracle的闪回特性
Oracle的闪回特性
 
数据库部门介绍
数据库部门介绍 数据库部门介绍
数据库部门介绍
 
Mysql性能监控实践报告 by junsansi
Mysql性能监控实践报告   by junsansiMysql性能监控实践报告   by junsansi
Mysql性能监控实践报告 by junsansi
 
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事
 

Similar to MySQL数据库生产环境维护

王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计YANGL *
 
如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统melity78
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统klandor
 
Sql语句的优化
Sql语句的优化Sql语句的优化
Sql语句的优化abszhanghe
 
Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作maclean liu
 
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页liu sheng
 
Chapter 4 models
Chapter 4 modelsChapter 4 models
Chapter 4 modelsEkman Hsieh
 
构建高性能MySQL系统
构建高性能MySQL系统构建高性能MySQL系统
构建高性能MySQL系统jackbillow
 
Single-Page App Development
Single-Page App DevelopmentSingle-Page App Development
Single-Page App Developmentgenify
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计hanmo1988
 
11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert systemted-xu
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理zhang shuren
 
资身Dba经验谈
资身Dba经验谈资身Dba经验谈
资身Dba经验谈yiditushe
 

Similar to MySQL数据库生产环境维护 (20)

王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
 
如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统如何架构和开发高性能,高伸缩性Web 应用系统
如何架构和开发高性能,高伸缩性Web 应用系统
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
 
Sql语句的优化
Sql语句的优化Sql语句的优化
Sql语句的优化
 
Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作
 
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页
20130626联动优势数据访问层DAL架构和实践5(刘胜)数据分片和分页
 
6
66
6
 
Chapter 4 models
Chapter 4 modelsChapter 4 models
Chapter 4 models
 
构建高性能MySQL系统
构建高性能MySQL系统构建高性能MySQL系统
构建高性能MySQL系统
 
Single-Page App Development
Single-Page App DevelopmentSingle-Page App Development
Single-Page App Development
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
 
11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理
 
资身Dba经验谈
资身Dba经验谈资身Dba经验谈
资身Dba经验谈
 
六合彩
六合彩六合彩
六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 

More from mysqlops

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautifulmysqlops
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解mysqlops
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementmysqlops
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationmysqlops
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Clustermysqlops
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationmysqlops
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsmysqlops
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告mysqlops
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫mysqlops
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用mysqlops
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现mysqlops
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析mysqlops
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考mysqlops
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示mysqlops
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDLmysqlops
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规mysqlops
 
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践mysqlops
 

More from mysqlops (20)

The simplethebeautiful
The simplethebeautifulThe simplethebeautiful
The simplethebeautiful
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解
 
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-managementPercona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-management
 
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replicationPercona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replication
 
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB ClusterPercona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
 
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internalsPldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internals
 
DBA新人的述职报告
DBA新人的述职报告DBA新人的述职报告
DBA新人的述职报告
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用eBay EDW元数据管理及应用
eBay EDW元数据管理及应用
 
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
 
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析
 
对MySQL DBA的一些思考
对MySQL DBA的一些思考对MySQL DBA的一些思考
对MySQL DBA的一些思考
 
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示
 
分布式存储与TDDL
分布式存储与TDDL分布式存储与TDDL
分布式存储与TDDL
 
Memcached
MemcachedMemcached
Memcached
 
DevOPS
DevOPSDevOPS
DevOPS
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规
 
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
 

MySQL数据库生产环境维护

  • 2. 大纲内容  表对象的DDL  表数据的DML  复制  Heartbeat的VIP漂移 www.mysqlops.com
  • 3. 表对象的DDL变更  增加字段的注意事项  DDL加速技巧  M-M架构的DDL变更技巧  其他建议 www.mysqlops.com
  • 4. 增加字段注意事项  增加字段必须要有默认值 例如: ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’;  增加的字段不能指定字段顺序,必须默认尾部增加模式 例如:增加一个字段到表对象的头部 ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0 FIRST; 备注:这是我们强烈发对的行为,可能导致需要更多时间用于数据重整,以及对复制可能造成数据错乱 应该写成:ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;  建议表设计都设置为NOT NULL 且默认值 非NULL且有默认值的字段属性,有利于提高数据比对检索的性能,更加有利于索引结构的优化  同一表增加多个字段,不分多条语句,而应只用一条变更语句 例如: ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0; ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’; 应该改写成: ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0, ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00';
  • 5. DDL加速技巧  DDL操作的过程 ① 申请表对象加锁,只允许读不允许更新 ② 复制一份变更对象表的结构代码 ③ 原数据结构基础之上修改,新建一组临时文件,MyISAM引擎和InnoDB引擎的文件有所不同, 分别为: #***.frm、#***.MYD、#***.MYI, #***.frm、#***.ibd ④ 变更对象表中的数据写入到临时表中 ⑤ 速度读写完毕的情况下,完全锁定被变更的表,并且删除被变更表 ⑥ 对临时文件执行RENAME操作 ⑦ 刷新数据字典信息 ⑧ 释放锁  调整的SESSION变量 ① 建议增加SESSION级别的 sort_buffer_size 值,以加速DDL过程需要做的排序操作; ② 建议增加SESSION级别的 read_buffer_size 值,增加顺序读的速度; ③ 建议增加SESSION级别的 tmp_table_size 和 max_heap_table_size值,增加内存缓存数据的能力; ④ 若是存在InnoDB引擎转MyISAM的操作,建议在线增加key_buffer_size的值,增加索引数据的缓存能力; www.mysqlops.com
  • 6. M-M架构的DDL变更技巧  M-M 复制架构,只有一台提供全部或主数据服务 推荐DDL语句,在当下M-M架构中属于备用数据库服务器上优先执行,有四项优点: ① 不立即影响数据库提供的 数据服务 ② 不阻塞主备之间数据复制的日志恢复操作 ③ DDL语句执行过程,若出问题只影响备库的稳定性,而很少会影响主库 ④ 若有数据服务无缝切换功能(例如:heartbeat、自主数据层等),可以在备库执行完成后,进行数据服务 提供的主备库切换,尤其是数据容量大的表变更时,可以减少对业务影响程度及减少停机维护时间和次数  M-M-multiS复制架构 针对双主复制,外加多从模式,就要分操作类型进行了,一般原则:线上环境不删除字段,修改为兼容性的属性, 为此针对此类操作我们建议: ① IP:10.10.1.124也即中转兼备用服务器上,先执行SET sql_log_bin=0; 然后执行DDL变更; ② 待上一步骤完成,再在对应的只读性质的丛库上执行DDL变更; ③ 待上述步骤都正常完成,再在IP:10.10.1.123服务器上执行SET sql_log_bin=0; 然后执行DDL变更; www.mysqlops.com
  • 7. 其他事项  索引优化命令执行顺序和坚持的原则: ① 优先执行创建索引的语句; ② 确保增加了对应的索引结构之后,再删除多余的索引; ③ 用户行为触发而执行频率越高的SQL命令,性能确保其性能最佳; ④ 数据变更类型(UPDATE OR DELETE)的SQL命令,索引可选择性优先;  数据库对象表结构的变更 ① 若是增加字段或字段属性值域扩大等类似操作,必须优先于应用程序发布; ② 若是字段的删除操作,则等应用程序成功发布之后再执行; ③ 若是字段类型变更,不兼容的情况下,则与版本发布同一时间段内完成(注:一般是停机维护类型); ④ 若是涉及索引的变更,则先于应用程序发布进行增加,等应用程序成功发布上线之后,再删除多余的索引。 www.mysqlops.com
  • 8. 数据库对象表数据的DML  DML语句书写建议  大数据量的DELETE OR UPDATE  定期规律性清理数据的DELETE  M-M架构的大数据量DML技巧 www.mysqlops.com
  • 9. DML语句书写建议  DML语句不允许出现@number方式替代字段名称 不合理的写法:UPDATE table_name SET @1=NOW() WHERE @2=1; 正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;  UPDATE OR DELETE 禁用LIMIT子句 不合理的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1 LIMIT 1; 正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;  INSERT语句需要写清楚值和字段对应关系 不合理的写法: INSERT INTO table_name VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY)); 正确的写法: INSERT INTO table_name(gmt_create,gmt_modify) VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));  DML语句少用不确定性函数 常见被大家使用的不确定性函数:UUID()、RAND()、SYSDATE()等函数,若无特殊用处之外,请以确定性函 数替代之。 推荐阅读的技术文章:曾用于内部培训的PPT内容:MySQL开发规范与实用技术交流 www.mysqlops.com
  • 10. 大数据量的DELETE OR UPDATE 可能出于某些原因和运营目的,需要对数据库中的数据进行大量的清理或更改某字段的值,分别举 二个示例: ① 网络专项整治的时期,需要删除大量含某些关键词的内容; ② 给符合某一条件(例如:等级,在线时长)的游戏玩家,赠送100~1000不等数量的游戏币; 给出的2个数据修改需求示例,若是直接根据相关要求去做,一个是需要用到模糊查询,另一个数据 更新条件也没有合理索引可用,为此可能造成表对象表级锁被长时间锁住,而且阻塞其他更改类型数据操作 服务,所以我们不得不采用更合理的办法,建议如下步骤解决: ① 设计并创建一张表tmp_pk_data ,用于记录将要被修改记录的主键,及需要的相关信息; ② 优先考虑在备库上跑一条SQL命令或存储过程的方式,把主键及相关数据写到表tmp_pk_data中; ③ 编写一个存储过程,使用游标循环控制获得tmp_pd_data的信息,根据主键更新或删除目标表的数据, 且建议此操作在备库上完成(注释:必须是双主复制模式,才可在备库上执行); www.mysqlops.com
  • 11. 定期规律性清理数据的DELETE 定期规律性数据的清理,优先对目标表的数据操纵方式进行分类: ① 若是日志类型的数据,则完全可以改为借助分区表的方式,比如按日期删除数据的条件,则可 以用日期作为数据分区条件,然后增删分区的方式实现数据的清理工作; ② 若是数据的UPDATE/DELETE/SELECT操纵条件,与定期清理数据的规则一致或被其包含,则 可以考虑使用分区表,然后借助删除分区方式达到数据清理的目标; ③ 若不能使用分区表解决的,则可以考虑参考上章节介绍的“大数据量的DELETE OR UPDATE” 内容; www.mysqlops.com
  • 12. M-M架构的大数据量DML技巧 日常工作中,可能偶尔会碰到非常紧急的大数据量订正工作,数据更新的条件也非常简单,还可能有合 理的索引使用。若是采用M-M复制架构,则可以考虑优先在备库上执行此操作,至少可以做到: ① 不阻塞数据复制的恢复线程; ② 若存在数据服务无缝切换机制,可选择备库执行完毕,立即切换主备的数据服务,减少对应用的影响; ③ 采用前面章节介绍的方法,先通过查询语句把数据写入对应的表中,再根据主键更新或删除,也可以 考虑在备库上执行,减少数据复制的恢复负载压力,通过复制的方式去更新主库上的数据,稍微要承 担一点数据被覆盖的风险; ④ 要向数据库中导入大量数据,建议对导入的数据文件先进行切割成相对合理的数据量,接着优先在备 用服务器上进行导入,而不应该选择直接主库上进行,而是通过MySQL自身的复制功能,同步到主数 据库服务器上; www.mysqlops.com
  • 13. 异步复制  replicate-ignore-db复制模式的注意事项 数据更新或数据结构变更的时候,必须先执行USE db_name的方式,到目标数据库对象内再执行 其他SQL语句,禁用类似:INSERT INTO db_name.tablename……语句  sql_log_bin MySQL5.1及以上版本支持参数:sql_log_bin,可以设置SET SESSION sql_log_bin=0的方式,达到 修改类型的SQL语句操作不会登记到二进制日志文件中,从而可以达到不会被复制到其备库上,为解决少 量主备数据不一致、复制中断,以及特殊的数据更改或数据结构变更等应用场景提供了方便;  sql_slave_skip_counter 用于跳过出错的SQL语句数量设置的参数,某些紧急情况或可忽略的错误,则可以借助此参数先恢复 复制的正常运行,步骤: ① STOP SLAVE; ② SET GLOBAL sql_slave_skip_counter=N 注释:N为跳过SQL的个数,不建议盲目跳 ③ START SLAVE; 推荐阅读的技术文章:生产环境搭建MySQL复制的教程 www.mysqlops.com
  • 14. Heartbeat的VIP漂移 前端应用配置的数据库连接为VIP,而VIP服务由Heartbeat软件实现,且数据库架构采用M-M架构, 为实现快速切换,可采用的步骤(假设A<->B,VIP加载在A主机上): ① 停掉A物理服务器上的Hearbeat服务:service heartbeat stop ② 检查VIP服务是否漂浮到B主机上,以及前端程序是否连接上来 ③ 检查是否恢复完从A主机复制过来的日志,及主备复制是否正常 ④ 关闭A主机上的mysqld服务:mysqladmin –uroot –p**** shutdown ⑤ 启动A主机上的Heartbeat服务启动: service heartbeat stop ⑥ 启动A主机上的mysqld服务:mysqld_safe & 推荐阅读的技术文章: MySQL DBA变更规范 HeartBeat搭建MySQL数据库双主热备高可用环境 www.mysqlops.com
  • 15. 会持续整理一系列对MySQL DBA工作,有帮助的技术 资料和经验分享,也会告诉大家工作中,以什么样的心态和 心境对待技术工作,让我们大家一起分享,一起成长! 便于大家及时接收到相关信息,请关注我们的微博或网 站,感谢您们一路的陪伴! 备注:mysql5.5版本的参数信息,将单独整理 新浪微博:http://weibo.com/mysqlops 腾讯微博:http://t.qq.com/mysqlops 邮箱地址:mysqlops@sina.com www.mysqlops.com