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语法结构:23SELECT4[INTO OUTFILE 'file_name'5 [CHARACTER SET charset_name]6 export_options7 | INTO DUMPFILE 'file_name'8 | INTO var_name [, var_name]]910语法解析: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-databases4其中,options为mysqldump命令的一些选项,可以使用如下命令查阅。5mysqldump --help61)mysqldump命令导出案例:7[root@jeames ~]# mkdir /dumpbak8[root@jeames ~]# chown mysql:mysql /dumpbak9##远程10mysqldump -uroot -proot -h192.168.1.88 -P3306 db1 -T /dumpbak11##本地服务器12mysqldump -uroot -proot test -T /dumpbak13说明: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 /dumpbak193)将数据库mes_db导出到目录/bk中,字段使用双引号用逗号隔开20mysqldump -uroot -proot --fields-terminated-by ',' --fields-enclosed-by '"' mes_db -T /bk2122注意: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.sql2或者在dump文件路径下执行mysql -uroot -proot< data.sql3【案例1】4MySQL全库备份,如何只恢复一个库?5① 备份全库6mysqldump -uroot -proot --all-databases> /bk/all.sql7② 指定当前数据库为db_school8sed -n '/^-- Current Database: `db_school`/,/^-- Current Database: `/p' all.sql> db1.sql9③ 导入10mysql -uroot -pxx -D db1<db1.sql11【案例2】12MySQL 全库备份,如何只恢复单个表的数据?13①导出建表语句,test为表,登陆数据库建表14sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test`/!d;q' all.sql > ddl.sql15② 生成插入语句16grep -i 'INSERT INTO `test`' all.sql>data.sql17③ 导入数据18mysql -uroot -proot -D db1 < data.sql