目录

7.1 导入导出

日常的运维中我们常用SELECT…INTO OUTFILE、mysqldump、mysql -e等导出数据,同时用LOAD DATA  INFILE、MySQLimport等导入数据,另外一些客户端工具,如navicat、dbeaver、workbench等也支持导入导出。

7.1.1 SELECT…INTO OUTFILE

SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构,导出的文件只能在服务器上。

(1)SELECT ... INTO OUTFILE是将表中的数据写到一个文件。

(2)LOAD DATA  INFILE则是将文件内容导入表。

1语法结构:
2
3SELECT
4[INTO OUTFILE 'file_name'
5 [CHARACTER SET charset_name]
6 export_options
7 | INTO DUMPFILE 'file_name'
8 | INTO var_name [, var_name]]
9
10语法解析:
111)CHARACTER SET:数据被转换成CHARACTER SET指定的编码格式输出。如果不指定的话默认为binary,
12即不做转换,如果指定多个编码格式,输出文件将不能被正确载入。
132)export_options:用于语句的exort_options部分的语法包括部分 FIELDS和 LINES子句,
14这些子句与LOAD DATA INFILE语句同时使用。

7.1.2 mysqldump

mysqldump是一个数据导出工具,能够导出数据库中的数据并进行备份,或者将数据迁移到其他数据库中,mysqldump命令的使用格式如下:

1shell> mysqldump [options] db_name [tbl_name ...]
2shell> mysqldump [options] --databases db_name ...
3shell> mysqldump [options] --all-databases
4其中,options为mysqldump命令的一些选项,可以使用如下命令查阅。
5mysqldump --help
61)mysqldump命令导出案例:
7[root@jeames ~]# mkdir /dumpbak
8[root@jeames ~]# chown mysql:mysql /dumpbak
9##远程
10mysqldump -uroot -proot -h192.168.1.88 -P3306 db1 -T /dumpbak
11##本地服务器
12mysqldump -uroot -proot test -T /dumpbak
13说明:
14-T 后面必须加目录,自动生成两个文件:
15一个.sql 文件,创建表结构的语句
16一个.txt 文件,数据文件
172)将数据库db_name中的t1及t2表导出到dumpbak目录中,多个表中间使用空格
18mysqldump -uroot -proot -h192.168.66.35 -P3317 db_name --tables t1 t2 -T /dumpbak
193)将数据库mes_db导出到目录/bk中,字段使用双引号用逗号隔开
20mysqldump -uroot -proot --fields-terminated-by ',' --fields-enclosed-by '"' mes_db -T /bk
21
22注意:
231、mysqldump 和 mysqld 在同一个主机上,可以生成.sql 和.txt 文件
242、mysqldump 和 mysqld 在不同主机上,只生成.txt 文件
253、mysqldump 和 mysqld 不能位于不同操作系统,否则会报
264、如果在Linux系统,可以使用如下命令转换格式
27find ./ -name "*.txt" | awk -F "." '{print $2}' | xargs -i -t mv ./{}.txt ./{}.csv

7.1.3 Mysqldump逻辑备份恢复

Mysqldump是mysql自带的备份工具,一般在如下目录中:

/usr/local/mysql/bin/mysqldump,支持基于innodb的热备份。但是由于是逻辑备份,所以速度不是很快,适合备份数据比较小的场景,是一个客户端工具。

生产上一般都是基于Mysqldump完全备份+二进制日志可以实现基于时间点的恢复。

1恢复的方法:mysql> source d:\script.sql
2或者在dump文件路径下执行mysql -uroot -proot< data.sql
3【案例1】
4MySQL全库备份,如何只恢复一个库?
5① 备份全库
6mysqldump -uroot -proot --all-databases> /bk/all.sql
7② 指定当前数据库为db_school
8sed -n '/^-- Current Database: `db_school`/,/^-- Current Database: `/p' all.sql> db1.sql
9③ 导入
10mysql -uroot -pxx -D db1<db1.sql
11【案例2】
12MySQL 全库备份,如何只恢复单个表的数据?
13①导出建表语句,test为表,登陆数据库建表
14sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test`/!d;q' all.sql > ddl.sql
15② 生成插入语句
16grep -i 'INSERT INTO `test`' all.sql>data.sql
17③ 导入数据
18mysql -uroot -proot -D db1 < data.sql