mysql迁移数据目录
背景
随着公司站点的发展,用户和访问量日益增加,经常会出现数据库主从出现延迟的情况,例如,用户在点击充值页进行充值时,经常会出现充值不到账的情况,针对这个问题,对数据库进行排查,发现,磁盘IO极不稳定,iowait也很高,%util一直在90左右,这说明产生的I/O请求很多,IO已经满负荷,磁盘IO存在瓶颈。所以需要加一块SSD盘,来提高IO处理速度。
磁盘IO情况检测
可以结合vmstat
和iostat
来判断IO和cpu的一些情况,例如:
1 2 3 4 5 6 7 8 9 |
vmstat 1 100 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 144716 133152 3805212 0 0 485 1565 2 2 3 1 90 6 0 1 0 0 140188 133152 3808372 0 0 59940 744 2252 1537 42 2 36 20 0 1 0 0 146236 133152 3803568 0 0 37632 7384 2434 1969 45 2 39 14 0 1 1 0 120212 133152 3830100 0 0 26656 304 1469 1144 18 1 35 46 0 1 0 0 143180 133156 3804948 0 0 48004 804 2292 1577 43 2 41 14 0 0 1 0 158224 133156 3791228 0 0 28796 7988 2514 2212 45 2 37 17 0 |
---|
r 表示运行队列,即多少个进程分配到了CPU,如果超过CPU核数,就会出现CPU瓶颈了
b 表示阻塞的进程
si 每秒从磁盘读入虚拟内存的大小,大于0,表示物理内存不够用或者内存泄漏
so 表示从磁盘每秒写入虚拟内存的大小,大于0,同上
bi 表示系统上所有的磁盘和其他块设备上每秒读入的总量
bo 表示所有磁盘上每秒写入的总量
in 每秒CPU中断的次数,包括时间中断
us 表示用户进程消耗的CPU时间百分比,us值越高,说明用户进程消耗CPU时间越多,如果长期大于50%,则需要考虑优化程序或者算法
sy 表示系统内核进程消耗的CPU时间百分比,一般来说us+sy应该小于80%,如果大于80%,说明可能存在CPU瓶颈
id 表示CPU处在空间状态的时间百分比
wa 表示IO等待所占用的CPU时间百分比,wa值越高,说明I/O等待越严重,根据经验wa的参考值为20%,如果超过20%,说明I/O等待严重,引起I/O等待的原因可能是磁盘大量随机读写造成的
综上,我们在判断IO问题的时候,参考bi
、bo
、wa
便可以判断IO的情况。
再来看下iostat
的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
iostat -x -k 1 100 Linux 3.10.0-693.2.2.el7.x86_64 (xs_88_55) 05/08/2018 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 3.07 0.00 0.92 5.72 0.00 90.30 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.01 83.24 7.92 199.19 954.62 3104.95 39.20 0.53 2.57 31.62 1.42 0.62 12.84 vdb 0.00 0.07 0.05 0.13 12.04 11.01 256.26 0.01 49.74 19.07 60.37 1.13 0.02 avg-cpu: %user %nice %system %iowait %steal %idle 1.01 0.00 0.51 2.53 0.00 95.96 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 4.00 30.00 2.00 124.00 24.00 9.25 0.03 0.78 0.77 1.00 0.09 0.30 vdb 0.00 83.00 8.00 119.00 68.00 828.00 14.11 0.07 0.53 0.62 0.52 0.53 6.70 avg-cpu: %user %nice %system %iowait %steal %idle 1.00 0.00 0.50 2.49 0.00 96.02 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 61.00 14.00 88.00 152.00 632.00 15.37 0.05 0.46 0.50 0.45 0.46 4.70 |
---|
%user:应用程序使用CPU的时间占比
%system:内核程序使用CPU的时间占比。
%iowait:CPU花费了多少时间去等待磁盘IO
%util: 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态
综上,在看IO时,关注iowait
和util
来判断IO情况。
数据迁移
1、最好是先进行锁表操作,防止数据被写入,我这里由于使用的atlas,只要停掉该程序,就不会有数据写入。
1 |
mysql> flush tables with read lock |
---|
解锁用:
1 |
mysql> unlock tables; |
---|
2、将MySQL旧的数据目录里的数据拷贝到SSD目录
1 2 |
cp -a /usr/local/mysql/data/* /mysql_data/data/ chown -R mysql.mysql data |
---|
3、配置文件里修改数据目录
1 |
datadir = /mysql_data/data |
---|
4、重启服务
1 |
/etc/init.d/mysqld restart |
---|
5、这里在查看数据库主从状态信息时,遇到问题,IO线程和SQL线程均为NO,需要重新确立主从关系
1 2 3 4 5 |
1、两边机器执行show master status;来查看binlog日志位置和文件名 2、两边分别执行语句来重新确立主从关系 change master to master_host='A',master_user='xs',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=222; 3、开启主从 start slave; |
---|
这里执行start slave时遇到问题:
1 2 |
mysql> start slave; ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository |
---|
查看err日志:
1 2 3 4 5 6 7 8 |
2018-05-08 03:29:37 15255 [ERROR] /usr/local/mysql/bin/mysqld: File '/mysql_data/data/relay-bin.000472' not found (Errcode: 2 - No such file or directory) 2018-05-08 03:29:37 15255 [ERROR] Failed to open log (file '/mysql_data/data/relay-bin.000472', errno 2) 2018-05-08 03:29:37 15255 [ERROR] Could not open log file 2018-05-08 03:29:37 15255 [ERROR] /usr/local/mysql/bin/mysqld: File '/mysql_data/data/relay-bin.000471' not found (Errcode: 2 - No such file or directory) 2018-05-08 03:29:37 15255 [ERROR] Failed to open log (file '/mysql_data/data/relay-bin.000471', errno 2) 2018-05-08 03:29:37 15255 [ERROR] Could not open log file 2018-05-08 03:29:37 15255 [ERROR] Error reading relay log configuration. 2018-05-08 03:29:37 15255 [ERROR] Failed to initialize the master info structure |
---|
找不到relay-bin.000471文件,原因是我们的数据目录指向了新的位置,在mysql库中的slave_relay_log_info表中依然保留之前relay_log的信息,所以导致启动slave报错
解决办法:
1 2 3 4 |
reset slave; change master to master_host='A',master_user='xs',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=222; start slave; |
---|
如果问题依然出现,则需要看下数据目录中的slave-relay-bin.index 文件,正常是只记录relay-bin文件名,但是如果出现其他文件,例如Failed to initialize the master info structure,则需要我们手动清理下这个文件。
1 2 3 4 5 6 7 8 |
mysql-bin.index relay-log.info slave-relay-bin.index 将以上三个文件mv走即可,然后重启数据库,随后从库上做如下操作: reset slave; change master to master_host='A',master_user='xs',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=222; start slave; |
---|
问题解决。
- SQL Server 存储过程生成insert语句
- silverlight 背景透明
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
- 如何利用深度学习识别千万张图片?
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表
- 43 Hot Flex and ActionScript 3.0 APIs, tips and tools for Autumn 2008
- 异步数据存储
- 谈谈基于SQL Server 的Exception Handling[中篇]
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- 如何仅使用TensorFlow C+来训练深度神经网络
- 捕获silverlight滚轮事件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 关于php unset对json_encode的影响详解
- python实现二分类和多分类的ROC曲线教程
- PHP随机数函数rand()与mt_rand()的讲解
- PHP实现小程序批量通知推送
- Keras loss函数剖析
- Laravel使用scout集成elasticsearch做全文搜索的实现方法
- python3.4中清屏的处理方法
- TensorFlow Autodiff自动微分详解
- python interpolate插值实例
- pandas.DataFrame.drop_duplicates 用法介绍
- python如何进入交互模式
- PHP静态方法和静态属性及常量属性的区别与介绍
- 详解PHP变量传值赋值和引用赋值变量销毁
- Keras 利用sklearn的ROC-AUC建立评价函数详解
- PHP如何防止XSS攻击与XSS攻击原理的讲解