Mysql迁移
背景
生产环境上的Mysql服务器资源有限,需要迁移到另外一台资源更多的服务器。
准备工作
- 新服务器安装mysql(如果本身有Mysql,重装Mysql,一定要重启服务;
- 将mysql服务加入到开机自启列表;
- 停服,备份数据;
开始
目标服务器上新建Mysql用户、数据库;
传输备份脚本;
刚开始使用scp命令将备份脚本传输到目标服务器,使用Mysql命令恢复DB。备份脚本500多M,压缩后150多,采用这种方式实在是太慢。
摸索其他方式,最后通过Mysql Workbench里的Schema Transfer Wizard功能进行同步,大大缩短了同步时间。
应用连接Mysql进行验证,成功;
调优
迁移到新服务器之后,检测到应用响应时间过长,主要是因为数据库返回比较慢。对Mysql进行调优,主要是开启Mysql查询缓存,应用恢复正常响应速度。下面列举一些常用配置
查询缓存的设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#查看查询缓存的设置
#如下参数都可是使用 select @@global.XXXX; 单独查询
show variables like '%query_cache%';
hava_query_cache 查询缓存是否可用,YES/NO
query_cache_limit 缓存大小,超过该值不会进行缓存,默认1M
query_cache_min_res_unit 双刃剑,默认4KB,设置值大对大数据查询有好处,如果都是小数据查询,易造成内存碎片和浪费
query_cache_size 缓存内存大小。
设置方法:set @@global.query_cache_size=1000000;
query_cache_type 查询缓存是否使用,OFF(0)/ON(1)/DEMAND(2)
当DEMAND时,必须使用SQL_CACHE关键字才会缓存,如select SQL_CACHE user_name from user;
当ON时,不想使用缓存使用sql_no_cache关键字,如select sql_no_cache user_name from user;另外,SQL中有用到mysql函数也不会缓存。
设置方法: set session query_cache_type=off;
query_cache_wlock_invalidate
#查看查询缓存的状态
show status like '%Qcache%';
Qcache_free_blocks 目前处于空闲状态的 Query Cache中内存Block数量
Qcache_free_memory 目前处于空闲状态的 Query Cache内存总量
Qcache_hits Query Cache 命中次数
Qcache_inserts 向 Query Cache中插入新的 Query Cache的次数,即没命中的次数
Qcache_lowmem_prunes 当 Query Cache内存容量不走,删除老的 Query Cache给新对象的次数
Qcache_not_cached 没有被Cache的SQL数,包含无法被Cache的SQL、由于query_cache_type设置不会被Cache的SQL
Qcache_queries_in_cache 目前 Query Cache中的SQL数量
Qcache_total_blocks Query Cache中总Block数量
#调优
1. query_cache_min_res_unit的设置
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache
2. Qcache_Lowmem_prunes值较大,说明查询缓存区较小,需调大;
3. Qcache_free_blocks 较多,说明内存碎片较多,需清理,FLUSH QUERY CACHE
4. 查询缓存碎片率: Qcache_free_blocks / Qcache_total_blocks * 100%
该值超过20%,使用FLUSH QUERY CACHE整理缓存碎片,或者调小query_cache_min_res_unit
5. 查询缓存利用率:(query_cache_size - Qcache_free_memory) / query_cache_size * 100%
该值在25%以下,说明query_cache_siz设置过大,可适当减小;
该值在80%以上,且Qcache_lowmem_prunes > 50,说明query_cache_siz有点小,或者碎片太大;
6. 查询缓存命中率:(Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
该值较低,说明写操作比较频繁,或者有些碎片其他配置
大部分应用,设置查询缓存的配置就可以满足需要了,如果不够可以设置其他参数
one more thing
还有一点需要注意,有时设置了各项参数调整之后,Mysql反应还是很慢,这时候可以查看磁盘使用情况,有可能是磁盘容量不够,限制了读写导致查询效率低。