总结MySQL导出导入用法,采坑了一些问题,希望能帮到你少走点弯路
导出
使用mysqldump命令导出
1. 导出整个数据库(结构+数据)
用法:mysqldump -u 用户名 -p 数据库名 > 导出的文件名
案例:mysqldump -u dbuser -p dbname > dbname.sql
2. 导出某一个或者几张表
用法:
单表:mysqldump -u 用户名 -p 数据库名 表名 > 导出的文件名
多表:mysqldump -u 用户名 -p 数据库名 表名1 表名2 表名3 > 导出的文件名
案例:mysqldump -u dbuser -p dbname users> dbname_users.sql
注:尝试了模糊某一类表名导出,mysqldump却不支持
导入
有两种方式
1. 首先建空数据库
mysql>create database abc;
2、导入
方式一:
(1)登录mysql
mysql -uroot -p
(2)然后选择数据库
mysql> use abc;
如果想省略这一步,则(1)为:mysql -uroot -p abc
(3)设置数据库编码
mysql> set names utf8mb4;
(4)导入数据(注意sql文件的路径)
mysql> source /home/abc/abc.sql;
方式二:
用法:mysql -u用户名 -p密码 数据库名 < 数据库名.sql
案例:mysql -uabc -p123456 abc < abc.sql
附加说明:
1. 如果是远程操作,则在mysqldump或mysql命令中,使用-h参数,填写主机名或ip即可
案例:mysqldump -h hostname -u dbuser -p dbname > dbname.sql
2. 如果想不阻塞同步执行,即后台运行,则使用nohup
案例:nohup mysqldump -h hostname -u dbuser -p dbname > dbname.sql &
常见问题
问题1:登录mysql,卡住,提示Reading table information for completion of table and column names......
原因:预读数据库信息,由于数据库太大,即数据库中表非常多,所以预读数据库信息将非常慢,就会卡住,如果数据库中表非常少,将不会出现问题
解决办法:登录mysql时,使用-A参数
案例:mysql -uroot -p -A
问题2:导入数据时,提示ERROR 1064 (42000) at line 93: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near....
原因:导入数据时的默认编码(utf8)与导出文件的默认编码(utf8mb4)不一致
解决办法1:导入数据时,使用了导入的方式一
解决办法2:加上--force 这个参数
案例:mysql -uabc -p123456 --default-character-set=utf8mb4 --force abc < abc.sql
问题3:导入数据时(从5.6导入到5.7版本),提示[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation....
原因:
1. 导入RDS for MySQL 实例时,SQL 语句中含有需要 Supper 权限才可以执行的语句,而 RDS for MySQL不提供 Super 权限,因此需要去除这类语句。
2. 本地 MySQL 实例没有启用 GTID。可能的解决办法:
1. 去除DEFINER子句:
a. 检查 SQL 文件,去除下面类似的子句。
DEFINER=`root`@`%`
b. 在 Linux 平台下,可以尝试使用下面的语句去除。
sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/ ' your.sql > your_revised.sql2. 去除GTID_PURGED子句
a. 检查 SQL 文件,去除下面类似的子句。
SET @@GLOBAL.GTID_PURGED='d0502171-3e23-11e4-9d65-d89d672af420:1-373,
d5deee4e-3e23-11e4-9d65-d89d672a9530:1-616234';
b. 在 Linux 平台下,可以尝试使用下面的语句去除。
awk '{ if (index($0,"GTID_PURGED")) { getline; while (length($0) > 0) { getline; } } else { print $0 } }' your.sql | grep -iv 'set @@' > your_revised.sql
c. 导出的时候在mysqldump命令后添加参数 --set-gtid-purged=off来取消输出GTID_PURGED 子句.我使用了c的方式(此问题详见阿里云帮助文档):
案例:导出时使用 mysqldump --set-gtid-purged=off -u dbuser -p dbname > dbname.sql
问题4:Mysql命令行下如何kill掉会话
步骤1:登录数据库
## 查看mysql中现在执行的 所有线程
步骤2:show processlist 或 show full processlist
## kill 掉 指定的第一列线程id
步骤3:kill thread_id
附加其他用法:
修改Mysql最大连接数的其中一种方式如下:
命令行查看和修改最大连接数(max_connections)
>mysql -uuser -ppassword(命令行登录MySQL)
mysql> show variables like 'max_connections'; (查可以看当前的最大连接数)
msyql> set global max_connections=1000; (设置最大连接数为1000,可以再次查看是否设置成功)
mysql> exit
参考资料:
- 1. mysql导入导出sql文件
- 2. mysql 导入数据编码设置
- 3. 解决:Reading table information for completion of table and column names
- 4. MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx: Unknown command '\Z'.
- 5. 阿里云帮助文档
------------------------------------------------------
------------------------------------------------------
关于我(个人域名)
期望和大家一起学习,共同进步,共勉,O(∩_∩)O谢谢
欢迎交流问题,可加个人QQ 469580884,
或者,加我的群号 751925591,一起探讨交流问题
不讲虚的,只做实干家
Talk is cheap,show me the code