mysql 数据备份从大的层面分为逻辑备份与物理备份,逻辑备份是对数据通过 sql 语句的方式保存为指定的文件,通过导入数据库进行恢复。物理备份主要是将数据通过物理日志的方式(binlog)进行保存。
一、逻辑备份
逻辑备份可以分为三个方面,数据库表的简单备份、基于数据库级别的逻辑备份、数据库级别的物理备份,以上三个方面是个人划分,适用于不同的场景中。
1. 数据库表的简单备份
数据库表的简单备份适用于在生产环境中让新手(菜鸟)进行数据的修改和删除的情况,防止数据的丢失和不可恢复的情况。
具体的方法主要有两种:
1.1 like 方式
create [temporary] table [if not exists] table_name (like source_table);
# 注解:该方式只是将 复制 source_table 中的表结构,不 copy 数据
## [ ]: 表示可选, table_name:标识新建的表名称,source_table: 复制的表结构
该方式只是对指定表的结构进行拷贝,不会拷贝数据,后续继续使用如下 sql 执行
insert into table2 select * from table1
该方式的缺点:
- 不能拷贝数据
1.2 select 方式
create [temporary] table [if not exists] table_name (select * from source_table);
# 注解:该方式会将表的数据全部进行复制,但是索引、注解等内容没有进行复制
## [ ]: 表示可选, table_name:标识新建的表名称,source_table: 复制的表结构
select 方式会将表的数据全部进行复制,但是索引、注解等内容没有进行复制。
以上是两种简单方式的表数据复制的使用方式。
1.2 select into
详细:https://www.runoob.com/sql/sql-select-into.html
复制所有的列插入到新表中:
SELECT * INTO newtable [IN externaldb] FROM table1 ;
只复制希望的列插入到新表中:
SELECT column_name(s) INTO newtable [IN externaldb] FROM table1 [ where 筛选];
2. 数据库层面的逻辑备份
数据库层面的逻辑备份,也就是可以指定数据库进行备份和全部的数据库进行备份,逻辑备份的含义是生成具体的 sql 文件(内容:insert...)进行保存。mysql 数据库提供了具体的备份命令以及一些开源工具。
备份方式:mysqldump、mysqlpump(多线程,不推荐)、开源工具(mydumper)
2.1 mysqldump
1.命令格式
mysqldump [选项] 数据库名 [表名] > 脚本名
或
mysqldump [选项] --数据库名 [选项 表名] > 脚本名
或
mysqldump [选项] --all-databases [选项] > 脚本名
2.选项说明
3. 示例
--single-transaction 表示进行一致性的备份.
参数 --single-transaction 是必须加的参数,否则备份文件的内容不一致,这样的备份几乎没有意义。
如果你总忘记参数 --single-transaction,可以在 MySQL 的配置文件中加上如下提示:
# my.cnf
[mysqldump]
single-transaction
备份所有数据库:
mysqldump -uroot -p --all-databases > /backup/mysqldump/all.sql
备份指定数据库:
mysqldump -uroot -p db --single-transaction > /backup/mysqldump/test.sql
备份指定数据库指定表(多个表以空格间隔)
mysqldump -uroot -p db table1 table2 --single-transaction > /backup/mysqldump/2table.sql
备份指定数据库排除某些表
mysqldump -uroot -p db --ignore-table=db.table1 --ignore-table=db.table2 --single-transaction > /backup/mysqldump/test2.sql
3. 还原数据
1. 系统还原命令
# 步骤一:创建表(与原来的表名保持一致)
mysqladmin -uroot -p create db_name
# 步骤二:导入数据
mysql -uroot -p db_name < /backup/mysqldump/db_name.sql
2. source 还原
mysql > use db_name
mysql > source /backup/mysqldump/db_name.db
2.2 mysqlpump
命令 mysqlpump 的使用几乎与 mysqldump 一模一样,唯一不同的是它可以设置备份的线程数,如:
mysqlpump -A --single-transaction --default-parallelism=8 > backup.sql
Dump progress: 1/1 tables, 0/0 rows
Dump progress: 25/37 tables, 881632/42965650 rows
Dump progress: 25/37 tables, 1683132/42965650 rows
......
上面的命令显示了通过 mysqlpump 进行备份。
- 参数 --default-parallelism 表示设置备份的并行线程数。
此外,与 mysqldump 不同的是,mysqlpump 在备份过程中可以查看备份的进度。
不过在真正的线上生产环境中,不推荐你使用 mysqlpump, 因为当备份并发线程数超过 1 时,它不能构建一个一致性的备份。见 mysqlpump 的提示:
另外,mysqlpump 的备份多线程是基于多个表的并行备份,如果数据库中存在一个超级大表,那么对于这个表的备份依然还是单线程的。
2.3 mydumper
mydumper 是一个开源的、逻辑备份的工具,地址:https://github.com/maxbube/mydumper
mydumper 的强大之处在于:
- 支持一致性的备份;
- 可以根据表中的记录进行分片,从而进行多线程的备份;
- 对于恢复操作,也可以是多线程的备份;
- 可以指定单个表进行多线程的恢复。
mydumper 几乎是一个完美的逻辑备份工具,是构建备份系统的首选工具。
mydumper 使用示例:
mydumper -o /bak -r 100000 --trx-consistency-only -t 8
上面的命令表示,将备份文件保存到目录 /bak 下,其中:
- 参数 -r 表示每张表导出 100000 条记录后保存到一张表;
- 参数 --trx-consistency-only 表示一致性备份;
- 参数 -t 表示 8 个线程并行备份。
可以看到,即便对于一张大表,也可以以 8 个线程,按照每次 10000 条记录的方式进行备份,这样大大提升了备份的性能。
二、物理备份
逻辑备份虽然好,但是它所需要的时间比较长,因为本质上逻辑备份就是进行 INSERT ... SELECT ... 的操作。
而物理备份直接备份数据库的物理表空间文件和重做日志,不用通过逻辑的 SELECT 取出数据。所以物理备份的速度,通常是比逻辑备份快的,恢复速度也比较快。
不如 mydumper 的是,物理备份只能恢复整个实例的数据,而不能按指定表进行恢复。MySQL 8.0 的物理备份工具可以选择官方的 Clone Plugin。
MySQL 8.0 的物理备份工具可以选择官方的 Clone Plugin。
Clone Plugin 是 MySQL 8.0.17 版本推出的物理备份工具插件,在安装完插件后,就可以对MySQL 进行物理备份了。而我们要使用 Clone Plugin 就要先安装 Clone Plugin 插件,推荐在配置文件中进行如下设置:
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
这时进行物理备份可以通过如下命令:
mysql> CLONE LOCAL DATA DIRECTORY = '/path/to/clone_dir';
可以看到,在 mysql 命令行下输入 clone 命令,就可以进行本地实例的 MySQL 物理备份了。
Clone Plugin 插件强大之处还在于其可以进行远程的物理备份,命令如下所示:
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
从上面的命令我们可以看到,Clone Plugin 支持指定的用户名密码,备份远程的物理备份到当前服务器上,根据 Clone Plugin 可以非常容易地构建备份系统。