阅读本文大概需要 6 分钟
之前在导数据库中的数据时,大都用的是 navicat 中自带的导入导出功能,这几天突发奇想,如果哪天直接让我在服务器上导数据,岂不是两眼摸瞎了,于是乎便有了这篇文章。
MySQL 的导出导出可以分成两大类,一种是逻辑导出,一种是物理导出。
逻辑导入导出
mysqldump
mysqldump 是命令行工具,主要用于mysql备份和还原数据。
导出命令
# 导出整个数据库结构和数据mysqldump -h[ip] -u[用户名] -p[密码] [数据库名] > [存储文件]# 导出整个数据库结构(不包含数据)mysqldump -h[ip] -u[用户名] -p[密码] -d [数据库名] > [存储文件]# 导出数据表结构和数据mysqldump -h[ip] -u[用户名] -p[密码] [数据库名] [数据表名] > [存储文件]# 导出数据表结构(不包含数据)mysqldump -h[ip] -u[用户名] -p[密码] -d [数据库名] [数据表名] > [存储文件]#命令后的数据表可以是多个,用于导出多数据表的场景!
导出示例
1、导出 test 数据库结构和数据mysqldump -h127.0.0.1 -uroot -p test > db.sql;2、导出 test 数据库中的表结构mysqldump -h127.0.0.1 -uroot -p -d test > db_struct.sql;3、导出 test 数据库中 users 表结构和数据mysqldump-h127.0.0.1-uroot-ptestusers>table.sql;4、导出 test 数据库中 users 表结构mysqldump -h127.0.0.1 -uroot -p -d test users > table_struct.sql;
导入命令
mysql -h[ip] -u[用户名] -p[密码] -e “source [备份文件]”
导入示例
# 登入Mysqlmysql -u root -pmysql> use test;mysql> source /var/lib/mysql/db.sql;
into outfile
有时候,我们需要根据查询条件导出SQL,这时 into outfile 就能派上用场了。
导出
select * from tb1 into outfile ‘/var/lib/mysql-files/outfile1’ fields terminated by ‘|’ enclosed by ‘”‘ lines terminated by ‘\r\n’ ;
导入
load data infile “/var/lib/mysql-files/outfile1” replace into table rooms fields terminated by ‘|’ enclosed by ‘”‘ lines terminated by ‘\r\n’ ;
注意
mysqld 的`secure_file_priv`配置 ,用来限制LOAD_FILE()和LOAD DATA和SELECT … ,INTO OUTFILE报表到指定的目录。
导入导出一定是在设定的目录文件,否则会报错。
load data 命令有两种用法:
不加“local”,是读取服务端的文件,这个文件必须在 secure_file_priv 指定的目录或子目录下;
加上“local” (在 load data 后加),读取的是客户端的文件,只要 mysql 客户端有访问这个文件的权限即可。这时候,MySQL 客户端会先把本地文件传给服务端,然后执行上述的 load data 流程。
物理导入导出
在 MySQL 5.6 版本引入了可传输表空间(transportable tablespace) 的方法,可以通过导出 导入表空间的方式,实现物理拷贝表的功能。
假设我们现在的目标是在 db1 库下,复制一个跟表 t 相同的表 r,具体的执行步骤如下:
1. 执行 create table r like t;,创建一个相同表结构的空表;
2. 执行 alter table r discard tablespace;,这时候 r.ibd 文件会被删除;
3. 执行 flush table t for export;,这时候 db1 目录下会生成一个 t.cfg 文件;
4. 在 db1 目录下执行 cp t.cfg r.cfg; cp t.ibd r.ibd;这两个命令(这里需要注意的是,拷贝得到的两个文件,MySQL 进程要有读写权限);
5. 执行 unlock tables;,这时候 t.cfg 文件会被删除;
6. 执行 alter table r import tablespace;,将这个 r.ibd 文件作为表 r 的新的表空间,由于这个文件的数据内容和 t.ibd 是相同的,所以表 r 中就有了和表 t 相同的数据。
参考
https://www.jianshu.com/p/590ca53f58c6
极客时间《MySQL 45 讲》
总结
对比三种数据导出方法的优缺点:
1.用 mysqldump 生成包含 INSERT 语句文件的方法,可以在 where 参数增加过滤条件,来实现只导出部分数据。这个方式的不足之一是,不能使用 join 这种比较复杂的 where 条件写法。
2.用 select … into outfile 的方法是最灵活的,支持所有的 SQL 写法。但这个方法的缺点之一就是,每次只能导出一张表的数据,而且表结构也需要另外的语句单独备份。
3.物理拷贝的方式速度最快,尤其对于大表拷贝来说是最快的方法。如果出现误删表的情况,用备份恢复出误删之前的临时库,然后再把临时库中的表拷贝到生产库上,是恢复数据最快的方法。但是,这种方法的使用也有一定的局限性:
必须是全表拷贝,不能只拷贝部分数据;
需要到服务器上拷贝数据,在用户无法登录数据库主机的场景下无法使用;
由于是通过拷贝物理文件实现的,源表和目标表都是使用 InnoDB 引擎时才能使用。
此外,第一和第二种方式都是逻辑备份方式,是可以跨引擎使用的。