实战mysql大数据库备份60g数据消耗20分钟备份完成,压缩后约7g。
第1步:基本说明
如果备份的数据库非常大,比如几十G,还包含大量的富文本内容等,因此选择在服务器端备份完成后在下载到本地。
当然如果你的服务器带宽及性能非常好,也可以在本地远程备份,前提是你本地是Linux系统,因为mydumper只支持Linux环境。
如果备份大数据库,不建议选择Navicat、mysqlbench等。
值得提示的是,mydumper是基于快照备份,因此备份过程中可以进行业务查询和插入、修改、删除操作不受影响,建议最好不要操作等待备份完成后在操作。
第2步:下载安装
下载mydumper:wget https://github.com/maxbube/mydumper/releases/download/v0.14.5-3/mydumper-0.14.5-3-zstd.el7.x86_64.rpm
当然你也可以在本地下载完成后上传到服务器上进行安装。因为有时github访问慢或无法访问导致动态下载失败。
centos安装命令:yum install -y mydumper-0.14.5-3-zstd.el7.x86_64.rpm
第3步:辅助命令
(1).查看数据库大小,清楚大概总量情况:
SELECT table_schema AS '数据库名称', ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS 'GB' FROM information_schema.tables WHERE table_schema = '数据库名称' GROUP BY table_schema;
(2).列罗出数据库中所有表大小并排序显示,找到大表,方便后续大表单独备份
SELECT
table_name AS '表名',
ROUND(data_length / 1024 / 1024, 2) AS '数据大小(MB)',
ROUND(index_length / 1024 / 1024, 2) AS '索引大小(MB)',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS '总大小(MB)',
table_rows AS '预估行数'
FROM
information_schema.tables
WHERE
table_schema = '数据库名称'
ORDER BY
(data_length + index_length) DESC;
(3).执行备份命令报错mysql.sock找不到,则将mysql.sock复制到指定目录:
ln -s /usr/local/mysql/mysql.sock /var/lib/mysql/mysql.sock
(4).监控备份状态命令,主要观察服务器性能是否在消耗,判断是否在备份:top
(5).查看磁盘使用情况命令,主要观察磁盘是否有变化,判断是否在备份:df -h
**(6).磁盘状态实时监控,判断是否在备份:**iostat -x 1
(7).查看备份进度或备份大小,这个命令非常重要,你可以时不时看看备份的size情况:
ls -lhS /usr/local/dump_full/ | head -n 10
(8).这是个mysql命令,执行命令看看 mydumper 是不是卡在某个查询上,是否在工作,在初期阶段,这个命令非常重要,防止误以为备份卡主或失败:
SHOW PROCESSLIST;
(9).设置IP访问数据库权限,这是mysql命令:
CREATE USER 'root'@'localhost' IDENTIFIED BY '数据库密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
如果无法创建,则删除后在重新创建:
DROP USER IF EXISTS 'root'@'localhost';
FLUSH PRIVILEGES;
第4步:开始备份
值得说明的是:如果存在很大的大表一定要分开备份,如果一次全量备份可能会导致中断甚至备份很慢。
(1).用于高性能服务器配置命令 (如果存在大表不建议用这个备份,不过可以尝试下)
mydumper -u root -p 数据库密码 \
-h 127.0.0.1 \
-P 数据库端口 \
-B 数据库名称\
-t 4 \ #### 使用进程数量,如果服务器性能差,比如机械盘,则改为2
--compress \
--triggers \
--routines \
--events \
--less-locking \
--skip-tz-utc \
--chunk-filesize 256 \ ####分片默认256M,方便备份和还原
-l 60 -K \
--outputdir /usr/local/data_dump ####备份目录
(2).单独备份大表(主要指单表超过10G)(优先选择)
mydumper -u root -p 数据库密码 -h 127.0.0.1 -P 数据库端口 \
-B 数据库名称 -T 数据库名称. \
数据表名称 -t 1 --compress --less-locking --skip-tz-utc \
--chunk-filesize 128 -l 3600 \
-L /usr/local/mydumper.log -v 4 \
--outputdir /usr/local/dump_detail
(3).排除大表全量备份
mydumper -u root -p 数据库密码 -h 127.0.0.1 -P 数据库端口 \
-B 数据表名称 \
-t 4 --compress --less-locking --skip-tz-utc \
--chunk-filesize 256 -l 3600 \
-L /usr/local/newdir/mydumper_full.log -v 3 \
--regex '^(?!(数据表名称\.大表名称))' \
--outputdir /usr/local/newdir/dump_full
(4).分别查看备份后的切片,另外备份完成后mydumper进程会自动结束
ls -lht /usr/local/newdir/dump_detail/
ls -lht /usr/local/newdir/dump_full/
(6).分别压缩后用xftp下载到本地
tar -czvf /usr/local dump_full.tar.gz -C /usr/local dump_full
tar -czvf /usr/local dump_details.tar.gz -C /usr/local dump_detail
第5步:数据库还原(希望你永远都用不上)
myloader \
-u root -p '数据库密码' \
-h 127.0.0.1 \
-P 数据库端口\
-B 数据库名称\
-t 4 \
-v 3 \
-o \
--skip-tz-utc \
--directory /usr/local/dump