MySQL · 案例分析 · 磁盘空间不足
问题现象
1 | $ df -h |
原因分析
文件排序命令
1 | $ du -sxh /dir/* | sort -rh | head -5 |
多次执行查找最大文件
1 | $ du -sxh /data/* | sort -rh | head -5 |
最终,确定最大文件是 /data/mysql/cosmo_im_1004/bns_pm_pokayoke.ibd
MySQL · 误操作场景下数据快速恢复
背景
线上环境核心业务数据,delete/update
操作一张表,忘加 where
限制条件,如何快速恢复?
方案
- 备份恢复:先用全量备份恢复实例,再利用增量
binlog
备份恢复到误操作之前的状态,费时费力! - 第三方工具:binlog2sql(支持
DML Delete/Update
等语句回滚,不支持DDL Drop
等语句回滚)
binlog2sql 工具实战
支持
- MySQL 5.6/5.7
- Delete、Update
要求
- MySQL 配置要求
1 | [mysqld] |
1 | mysql> show variables like 'server_id'; |
- MySQL 权限要求:
SELECT
、REPLICATION SLAVE
、REPLICATION CLIENT
1 | mysql> show grants for 'cosmo_t'\G |
- 申请特权账号,登录服务器
操作步骤
安装 pip
安装 binlog2sql
1 | $ cd /usr/local/src |
- 根据误操作时间,确定
binlog
文件
1 | mysql> show master status; |
- 定位误执行
SQL
1 | $ python binlog2sql.py -h'x.x.x.x' -uroot -p'xx' -dtest -temployees --start-file='mysql-bin.000020' --sql-type=DELETE > result.sql |
- 解析出回滚
SQL
,并检查回滚SQL
是否正确
1 | $ python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'xx' -dtest -temployees --start-file='mysql-bin.000020' --start-pos=66374969 --end-pos=66375406 -B > rollback.sql |
Tips:回滚条数可以使用
%s/pattern/&/g
进行统计,pattern
是要搜索的关键字。
- 确认回滚
SQL
正确,执行回滚语句
1 | $ mysql -h127.0.0.1 -P3306 -uroot -p'xx' < rollback.sql |
工具
1 | # 连接配置 |
注意事项
- 还是先恢复再去面壁思过吧!
- 手工执行
delete
、update
语句前,先执行selete
语句。 drop
或者truncate
语句造成的误操作,通过备份来恢复。
MySQL · 修改数据库名
背景
需求:将数据库 hrtrqu
修改 hrtrzq
方案:MySQL 没有 rename database
命令,只能变相修改表到目标库里的表来实现。
实践
1. 导出库数据
1 | $ mysqldump --single-transaction -S /data/mysql3308/mysql.sock -usre -p'xx' hrtrqu > hrtrqu.sql |
2. 创建新库 hrtrzq
1 | CREATE DATABASE IF NOT EXISTS hrtrzq default charset utf8 COLLATE utf8_general_ci; |
3. 导入数据到新库
1 | $ mysql -S /data/mysql3308/mysql.sock -usre -p'sre@@p$i' hrtrzq < hrtrqu.sql |
MySQL · 快速删除大表
背景
生产环境有一张日志表 schedule_task_error_log
,数据量超过 5000w
,想通过 drop
删除但是速度很慢。
1 | -rw-rw----. 1 mysql mysql 5.1K Jan 8 2018 schedule_task_error_log.frm |
原理
前提:MySQL
开启了独立表空间,MySQL 5.6.7
之后默认开启。
1 | MariaDB> show variables like 'innodb_file_per_table'; |
MySQL
在删除大表的时候为什么慢?
Buffer Pool
页面清除过程(拥有InnoDB
全局锁)- 删除
ibd
磁盘文件过程
方案:利用了 Linux
中 硬链接 减少 DDL
时间,加快锁释放,来进行快速删除。
实践
1. 建立硬连接
1 | $ ln schedule_task_error_log.ibd schedule_task_error_log.ibd.hdlk |
2. drop table
再看物理文件的引用数变为 1,然后我们可以另外找时间手动删除物理文件。
1 | MariaDB> drop table schedule_task_error_log; |
3. 删除物理文件
1 | $ rm -rf schedule_task_error_log.ibd.hdlk |
Redis 开发与运维笔记
简介
Redis (Remote Dictionary Server)远程字典服务,是一个开源的、C语言编写的高性能的 key-value 缓存数据库。它可以减轻数据库的压力,提升读取效率。
- 性能极高,读的速度是 110000次/s,写的速度是 81000次/s 。
- 丰富的数据类型,支持 Strings、Lists、Hashes、Sets 及 Ordered Sets 数据类型。
- 原子,所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。
- 丰富的特性,支持 publish/subscribe、通知、key 过期等等特性。
安装
1 | $ cd /usr/local/src |
redis.conf
是默认的配置文件,可以根据需要使用自定义配置文件。
1 | $ redis-cli |
运维
Percona Toolkit · 用户权限显示工具 pt-show-grants
功能
显示 mysql.user
所有用户及权限
原理
- 先查找所有
user
和host
- 然后逐个执行
show grants
使用
1 | $ pt-show-grants -u 'xx' -p 'xx' -S /tmp/mysql.sock |
Percona Toolkit · 复制异常修复工具 pt-slave-restart
功能
pt-slave-restart:是一个修复由于不同的错误而意外终止 slave
复制的工具,和配置参数 slave_skip_errors 功能类似。
Warning:除非知道跳过操作的影响或后果,否则不要自动跳过任何错误,会影响数据一致性。
原理
它以指数变化的睡眠时间定期巡视检查 slave
复制状态,初始默认 1s
,并试图跳过导致错误的语句。
1 | Usage: pt-slave-restart [OPTIONS] [DSN] |
使用
1 | ./pt-slave-restart -uroot -p'xx' --error-numbers=1062 |