前天的文章中简单写了备份与恢复的方法,今天我们主要来看看不同的备份方法备份出来的文件结果,以及它们的恢复方法。

首先我们来看mysqldump备份出来的文件的内容,现将表t进行备份:

1root@localhost:3306 [test]>select * from t; 2+----+-----+ 3| id | age | 4+----+-----+ 5|  1 |   5 | 6|  2 |   4 | 7|  3 |   3 | 8|  4 |   2 | 9|  5 |   1 |10+----+-----+115 rows in set (0.08 sec)1213root@localhost:3306 [test]>exit14Bye1516C:\Users\yeyz>mysqldump --single-transaction -uroot -p test t > dump.sql17Enter password: ********然后打开备份文件,我们可以看到备份文件中的内容如下:

当我们想恢复这个备份文件的时候,我们可以通过mysql -u<user> -p dbname < dump.sql的命令来进行恢复,示例如下:

1root@localhost:3306 [test]>show tables; 2+----------------+ 3| Tables_in_test | 4+----------------+ 5| t              | 6| v_t            | 7| z              | 8| zz             | 9+----------------+104 rows in set (0.00 sec)1112root@localhost:3306 [test]>drop table t;13Query OK, 0 rows affected (0.77 sec)1415root@localhost:3306 [test]>exit16Bye1718C:\Users\yeyz>mysql -uroot -p test < dump.sql19Enter password: ********2021C:\Users\yeyz>mysql -uroot -p22Enter password: ********23Welcome to the MySQL monitor.  Commands end with ; or \g.24Your MySQL connection id is 625Server version: 5.7.24-log MySQL Community Server (GPL)2627Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.2829root@localhost:3306 [test]>use test30Database changed31root@localhost:3306 [test]>show tables;32+----------------+33| Tables_in_test |34+----------------+35| t              |36| v_t            |37| z              |38| zz             |39+----------------+404 rows in set (0.00 sec)4142root@localhost:3306 [test]>select * from t;43+----+-----+44| id | age |45+----+-----+46|  1 |   5 |47|  2 |   4 |48|  3 |   3 |49|  4 |   2 |50|  5 |   1 |51+----+-----+525 rows in set (0.00 sec)

再来看看select into outfile导出文件的试验过程,话不多说,备份的代码如下:

1root@localhost:3306 [test]>select * from t; 2+----+-----+ 3| id | age | 4+----+-----+ 5|  1 |   5 | 6|  2 |   4 | 7|  3 |   3 | 8|  4 |   2 | 9|  5 |   1 |10+----+-----+115 rows in set (0.00 sec)1213root@localhost:3306 [(none)]>use test14Database changed15root@localhost:3306 [test]>select * from t into outfile 'back.sql' ;16Query OK, 5 rows affected (0.01 sec)1718#查看文件内容191    5202    4213    3224    2235    1我们可以看到,这种备份方法相当于只备份了表里面的数据,而没有备份表的结构。如果我们觉得这个备份结果的格式不是我们想要的,还可以改成其他的风格,如下:

1root@localhost:3306 [test]>select * from t into outfile 'back3.sql' fields termi2nated by ',' lines starting by '本行记录内容:' terminated by '\r\n' ;34本行记录内容:1,55本行记录内容:2,46本行记录内容:3,37本行记录内容:4,28本行记录内容:5,1代码中的fields terminated表示列之间的分隔符,lines starting表示每一行开始的符号,lines terminated表示每一行结束的符号,windows中'\r\n'表示换行。

这种备份方式恢复的时候需要采用load data infile的方式,下面给出例子:

1root@localhost:3306 [test]>show tables; 2+----------------+ 3| Tables_in_test | 4+----------------+ 5| t              | 6| v_t            | 7| z              | 8| zz             | 9+----------------+104 rows in set (0.00 sec)1112root@localhost:3306 [test]>drop table t;13Query OK, 0 rows affected (0.38 sec)1415root@localhost:3306 [test]>load data into table t ignore 1 lines infile 'data.sql';16root@localhost:3306 [test]>load data into table t ignore 1 lines infile 'e:/mysq17l-5.7.24-win32/data/test/back.sql';1819root@localhost:3306 [test]>load data  infile 'e:/mysql-5.7.24-win32/data/test/ba20ck.sql' into table t;21ERROR 1146 (42S02): Table 'test.t' doesn't exist22root@localhost:3306 [test]>create table t (id int,age int);23Query OK, 0 rows affected (0.63 sec)2425root@localhost:3306 [test]>load data  infile 'e:/mysql-5.7.24-win32/data/test/back.sql' into table t;26Query OK, 5 rows affected (0.21 sec)27Records: 5  Deleted: 0  Skipped: 0  Warnings: 02829root@localhost:3306 [test]>select * from t;30+------+------+31| id   | age  |32+------+------+33|    1 |    5 |34|    2 |    4 |35|    3 |    3 |36|    4 |    2 |37|    5 |    1 |38+------+------+395 rows in set (0.00 sec)4041root@localhost:3306 [test]>上面的例子有个小问题需要注意一下,就是我们在导入一个表数据的时候,这个表不能删除,表结构必须存在,不然是没办法导入的,会提示table doesn't exist的错误。

再来看看mysqlimport方法,从本质上来说,它是load data infile的命令接口,而且大多数的选项都和load data infile语法相同,它的语法格式如下:

mysqlimport dbname text1 text2

与load data infile不同的是,mysqlimport可以用来导入多张表,并且通过--user-thread参数并发地导入不同的文件,这里的并发值得是并发导入多个文件,而不是指mysqlimport可以并发的导入一个文件,这是有明显区别的。如果有兴趣,可以试一下在load data的同时,连接mysql然后在命令行中show full processlist;这个时候,就可以看到mysqlimport实际上是同时执行多句load data infile的命令。