mydumper备份mysql大数据库的步骤

实战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