OUTFILE 命令备份

最简单的备份。

特点

  • MySQL原生SQL指令
  • 最原始的逻辑备份方式
  • 备份的功能和效果取决于如何写SQL语句

使用

数据准备

参考 MySQL示例数据库

查询导出路径

MySQL 都有个能够安全操作的文件目录,比如想把 outfile 内容导出成文件,就可以看下安装的 MySQL Server 可操作的系统文件路径

1
2
3
4
5
6
7
8
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| require_secure_transport | OFF                   |
| secure_auth              | ON                    |
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+

也就是导出时要导出到 /var/lib/mysql-files/ 这个文件夹里,这个文件夹才是 MySQL 能操作的安全文件夹。

导出至文件

将查询结果导出:

1
select * into outfile '/var/lib/mysql-files/out_file_test' from Z;

示例:

1
2
3
4
5
6
7
8
9
mysql> select * into outfile '/var/lib/mysql-files/store-out' from sakila.store;
Query OK, 3 rows affected (0.02 sec)

mysql> exit
Bye
# cat /var/lib/mysql-files/store-out
1	1	1	2006-02-15 04:57:12
2	2	2	2006-02-15 04:57:12
#

使用分隔符:

1
2
3
4
5
6
7
select * into outfile '/var/lib/mysql-files/store-out2' fields terminated by ',' from t1;
mysql> exit
Bye
# cat /var/lib/mysql-files/store-out2
1,1,1,2006-02-15 04:57:12
2,2,2,2006-02-15 04:57:12
#

小结

归纳

  • OUTFILE 是最简单的的原生数据备份工具
  • 使用简单、灵活,灵活指的是导出的取决于我们写的SQL
  • 导出的数据无法还原,仅用来简单导出数据
  • 在InnoDB事务下,可以做到一致性视图
  • 修改分隔符:fields terminated by
  • 修改换行符:lines terminated by

思考

1、Outfile 是否可以备份整个数据库?针对不足之处如何改进?

需要select库的所有表,需要将所有的表数据查询一遍再导出。

这么操作很繁琐,如何改进?

希望可以做到自动发送 SELECT 语句,而不是手动发送。

希望可以做到自动开启事务。在支持事务的引擎下可以做到从备份第一张表到最后一张表,备份的都是同一时刻的数据。备份完之后可以自动提交事务。

希望可以支持 INSERT 语句,可直接用于还原。