1. RDS MySQL数据备份
在阿里云官方文档中已经提出从RDS MySQL迁移数据至本地数据库的解决办法。
其中涉及到下载数据备份,文档中提到数据备份限制,MySQL 5.7 SSD云盘(含基础版和高可用版),不支持下载备份,仅可通过恢复功能将数据恢复到新建实例上。
恰巧,我使用的阿里云MySQL存储类型是SSD云盘属于无法备份数据的类型,在实例信息->备份数据标签->数据备份标签下的查询结构中不提供“下载”按钮,仅提供“恢复”按钮。所以,我从另外一条道路迁移数据:登录数据库管理服务DMS,导出数据库/导出SQL结果集。不同MySQL系列免费导出数据有行数限制。
2. 导入本地数据库
我曾经用Navicat for MySQL远程登录ECS UbantuOS-service mysql,所以考虑过使用工具导入sql文件。
Navicat for MySQL version = 10.1.7
Local MySQL DB version = 5.7.25
因为Navicat for MySQL工具有限制,无法insert含有回车、#、//的字符串,每次提示有语法错误,只能放弃这条道路。然后直接在UbantuOS的mysql shell下操作导入sql文件,可以成功建表和插入数据。导入方法:
方法一:
Shell>mysql -u root -p dbname</usr/~/fileName.sql
dbName:需要导入数据的数据库名称
/usr/~/:sql文件所在文件夹的全路径
回车会提示输入mysql的root账户的密码
方法二:
Shell>mysql -u root -p
mysql> use dbName; // dbName: 数据库名称
...
DATABASE CHANGED
mysql> source /usr/~/fileName.sql // /usr/~/:sql文件所在全路径
在建表时,曾经发生过异常:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
建表语句如下
CREATE TABLE `data` (
`id` varchar(30) NOT NULL,
`create_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这个错误的原因是高版本mysql(mysql version = 5.7.25)默认的sql_mode包含ONLY_FULL_GROUP_BY,这个属性保证了select到的列都在group by中出现。修改sql_mode属性后,建表时不再报错。查看sql_mode:
mysql>select @@GLOBAL.sql_mode;
result:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
修改命令:
- 暂时命令,重启service mysql后失效
set @@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- 永久命令,在mysql.cnf配置文件中添加一行,sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,并保存退出配置文件,重启service mysql后生效
Shell>sudo vim /etc/mysql/mysql.conf.d/mysql.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
character_set_server=utf8
# By default we only accept connections from localhost
# bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION