数据库:mysql库迁移和导入导出
站内链接:
移动目录
操作
- 前置条件
- a non-root user with sudo privileges.
- a MySQL server
- 设置步骤
moving the MySQL data directory:
1 | # Verify the current location by starting an interactive MYSQL session 或者查看/var/lib/mysql/my.conf配置 |
Point to the new data location:
1 | # Edit mysql configure files to reflect the new data directory |
Configuring apparmor access control rules:
1 | # Tell AppArmor to let MYSQL write the new directory by creating an alias between the default directory and |
Restart MYSQL:
1 | # Create the minimal directory structure to pass the script's enviroment check that scipt's name is: |
Remove old directory:
1 | sudo rm -Rf /var/lib/mysql.bak |
问题
- 错误:
Aborting because of a corrupt database page in the system tablespace. Or, there
产生这种错误原因是在迁移之前发生过数据库所在磁盘满的情况导致的表空间损坏, 重启数据库之后无法正常恢复数据, 最终导致数据页读取不到需要的 page 数据.
数据导入和导出
数据和结构
- 导出数据库中所有表结构和数据, 注意, 此时导出的 SQL 中不包含数据库的创建
1 | # a. 导出 |
实例:
1 | # 导出mysql docker容器中的数据 |
- 导出数据库中指定表结构和数据
1 | # a. 导出指定表 |
下面是一个简单的配置文件示例:
1 | [mysqldump] |
例子:
1 | cur_date=`date +%F` |
表结构
若仅仅想导出数据库表结构而不包含数据的化, 可以增加--no-data
选项以表示不到处数据
1 | # 导出 |
示例如下:
1 | # 1. 方式1 |
重命名数据库
前提条件: 确保配置了~/.my.cnf 文件,确保在命令行执行 mysql 命令无需输入user/password
,如果未配置,则需要在每一个 mysql 命令中添加--defaults-file
选项
- 正常方式改动步骤
- a. 停止 MySQL 服务器以避免对数据库的更改产生影响
- b. 备份数据库
- c. 运行命令:
RENAME DATABASE old_db_name TO new_db_name;
, 要求 mysql 版本在5.76
以上 - d.重启 MySQL 服务器并验证新的数据库
该方式可能因为 views 和 trigger 的存在导致重命名失败.
- 导入导出, 手动更改名字在录入
先导出备份数据库, 然后手动更改导出的文件, 最后再导入, 这个在生产环境和大数据库中根本不适合, 执行时间太长了, 可能出现中断的各种问题
- 新表, 其执行步骤:
- 创建一个新 database
- rename 旧 database 中的每一个表到新的 database
优化
- 删除无用记录
Mysql 中直接删除一些老的有 autoincrement 的数据是非常快的, 比如 50000 条数据在小的表中会 1~2 秒内完成
- optimize
在表删除之后, 磁盘空间其实没有释放, 下一次新建记录的时候, 会在这块碎片空间里存储, 如果需要释放某一个表的碎片空间, 使用: OPTIMIZE TABLE table_name;
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 狂想写作本!
评论