15
MySQL数据库生产环境维护 整理者:金官丁 站:ww.mysqlops.com

MySQL数据库生产环境维护

Embed Size (px)

DESCRIPTION

MySQL数据库生产环境维护

Citation preview

Page 1: MySQL数据库生产环境维护

MySQL数据库生产环境维护

整理者:金官丁

网 站:ww.mysqlops.com

Page 2: MySQL数据库生产环境维护

大纲内容

表对象的DDL

表数据的DML

复制

Heartbeat的VIP漂移

www.mysqlops.com

Page 3: MySQL数据库生产环境维护

表对象的DDL变更

增加字段的注意事项

DDL加速技巧

M-M架构的DDL变更技巧

其他建议

www.mysqlops.com

Page 4: MySQL数据库生产环境维护

增加字段注意事项 增加字段必须要有默认值

例如:

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';

Page 5: MySQL数据库生产环境维护

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

Page 6: MySQL数据库生产环境维护

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

Page 7: MySQL数据库生产环境维护

其他事项

索引优化命令执行顺序和坚持的原则:

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

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

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

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

数据库对象表结构的变更

① 若是增加字段或字段属性值域扩大等类似操作,必须优先于应用程序发布;

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

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

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

www.mysqlops.com

Page 8: MySQL数据库生产环境维护

数据库对象表数据的DML

DML语句书写建议

大数据量的DELETE OR UPDATE

定期规律性清理数据的DELETE

M-M架构的大数据量DML技巧

www.mysqlops.com

Page 9: MySQL数据库生产环境维护

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

Page 10: MySQL数据库生产环境维护

大数据量的DELETE OR UPDATE

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

二个示例:

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

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

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

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

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

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

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

③ 编写一个存储过程,使用游标循环控制获得tmp_pd_data的信息,根据主键更新或删除目标表的数据,

且建议此操作在备库上完成(注释:必须是双主复制模式,才可在备库上执行);

www.mysqlops.com

Page 11: MySQL数据库生产环境维护

定期规律性清理数据的DELETE

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

① 若是日志类型的数据,则完全可以改为借助分区表的方式,比如按日期删除数据的条件,则可

以用日期作为数据分区条件,然后增删分区的方式实现数据的清理工作;

② 若是数据的UPDATE/DELETE/SELECT操纵条件,与定期清理数据的规则一致或被其包含,则

可以考虑使用分区表,然后借助删除分区方式达到数据清理的目标;

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

内容;

www.mysqlops.com

Page 12: MySQL数据库生产环境维护

M-M架构的大数据量DML技巧

日常工作中,可能偶尔会碰到非常紧急的大数据量订正工作,数据更新的条件也非常简单,还可能有合

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

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

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

③ 采用前面章节介绍的方法,先通过查询语句把数据写入对应的表中,再根据主键更新或删除,也可以

考虑在备库上执行,减少数据复制的恢复负载压力,通过复制的方式去更新主库上的数据,稍微要承

担一点数据被覆盖的风险;

④ 要向数据库中导入大量数据,建议对导入的数据文件先进行切割成相对合理的数据量,接着优先在备

用服务器上进行导入,而不应该选择直接主库上进行,而是通过MySQL自身的复制功能,同步到主数

据库服务器上;

www.mysqlops.com

Page 13: MySQL数据库生产环境维护

异步复制

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

Page 14: MySQL数据库生产环境维护

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

Page 15: MySQL数据库生产环境维护

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

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

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

新浪微博:http://weibo.com/mysqlops

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

邮箱地址:[email protected]

www.mysqlops.com