mysql导出数据到文件的方法(mysql如何导出数据)

阅读本文大概需要 6 分钟

之前在导数据库中的数据时,大都用的是 navicat 中自带的导入导出功能,这几天突发奇想,如果哪天直接让我在服务器上导数据,岂不是两眼摸瞎了,于是乎便有了这篇文章。
mysql导出数据到文件的方法(mysql如何导出数据)

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 引擎时才能使用。

此外,第一和第二种方式都是逻辑备份方式,是可以跨引擎使用的。

发表评论

登录后才能评论