有时候,我们需要跨MySQL服务器复制表的数据,可以使用MySQL的select语句将文件导出成文本,然后再使用load语句导入到另一台MySQL服务器。这种复制数据的方式,简单高效。
- 确认导出权限是否开启
在进行数据导出之前,首先要确认导出权限是否开启,否则是禁止导出的。
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
会看到secure_file_priv的值,该值的路径就是允许数据导出的路径,必须将数据导出到secure_file_priv指定的路径。如果该值为NULL,说明禁止数据导出。那么需要进行设置,将导出权限打开。设置方法是Linux下,编辑my.cnf文件,具体如下:
[root@localhost ~]# vim /etc/my.cnf
在配置文件中添加指定数据导出路径的配置:
secure_file_priv = /var/lib/mysql-files #该值可以根据情况指定
指定好路径之后,需要对目录进行赋权,赋予可写的权限。否则可能报错没有写权限的错误。默认情况下,MySQL导出数据是使用的mysql用户,而不是root用户。赋权如下:
[root@localhost ~]# chmod 777 -R /var/lib/mysql-files
- 导出数据
配置好数据导出权限后,就可以进行数据导出了,很简单,具体如下:
mysql> select * from dbname.tablename into outfile '/var/lib/mysql-files/tablename.txt' CHARACTER SET utf8;
###指定导出数据的字段分隔符
mysql> select * from dbname.tablename into outfile '/var/lib/mysql-files/tablename.txt' FIELDS terminated by '\,' character set utf8;
其中编码的设置,必须要跟需要导入数据的数据库相同,跟导出数据的数据库无关。导入数据的数据库的编码是什么?可以在MySQL客户端使用status命令查看。如下:
mysql> status;
--------------
mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
Connection id: 23481
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 12 days 3 hours 23 min 51 sec
Threads: 5 Questions: 396746757 Slow queries: 0 Opens: 48403 Flush tables: 1 Open tables: 1808 Queries per second avg: 378.203
--------------
- 导入数据
数据导出之后,可以通过scp命令将数据文件远程拷贝到目标服务器,然后在目标服务器进行数据导入。导入命令如下:
mysql>load data local infile '/var/lib/mysql-files/table.txt' into table dbname.tablename character set utf8;
###指定导入数据的字段分割符
mysql>load data local infile '/var/lib/mysql-files/table.txt' into table dbname.tablename FIELDS terminated by ',' character set utf8;
这样,数据就可以导入到数据库中了。关于load data更详细的语法可以在MySQL客户端使用help load data查看。
这种方式的数据导出导入还是很快的,比mysqldump要快很多。如果要进行两个MySQL服务器之间的数据复制,可以考虑这种方式。如果表较多,可以通过编写脚本,自动的进行数据导出导入。