0、mysqldump路径
1、数据导出
1.1 从宿主机导出
-p直接加密码不行,可以用双引号 -p"xxxxx"
备份整个库的表
mysqldump -h xxx.xxx.x.xxx -P 3307 -u root -pxxxxx abrbak > abrbak_full_backup.sql
备份多张表(结构+数据)
mysqldump -h xxx.xxx.x.xxx -P 3307 -u root -pxxxxx abrbak --tables chat_log chat_session task_baseinfo abr_sms_task abr_call_task task_detail > abrbak_tables.sql
只备份表结构
mysqldump -h xxx.xxx.x.xxx -P 3307 -u root -pxxxxx abrbak --no-data > abrbak_structure.sql
代码解释
这个命令是一个使用mysqldump
工具来备份MySQL数据库中指定表的示例。命令各部分的含义如下:
-
mysqldump
: MySQL数据库备份工具,用于导出数据库的结构和数据为SQL格式的文件。 -
-h xxx.xxx.x.xxx
: 指定数据库服务器的IP地址为xxx.xxx.x.xxx -
-P 3307
: 指定数据库服务的端口号为3307,注意-P
是大写的,区别于小写-p
,后者用于指定密码。 -
-u root
: 指定数据库的用户名为root。 -
-pxxxxxx
: 指定连接数据库的密码为xxxxxx。这里密码紧跟在-p
后面,没有空格。 -
abrbak
: 指定要备份的数据库名为abrbak
。 -
--tables chat_log chat_session task_baseinfo abr_sms_task abr_call_task task_detail
: 指定需要备份的表名列表,这里包括chat_log
、chat_session
、task_baseinfo
、abr_sms_task
、abr_call_task
和task_detail
这六个表。 -
>
: Linux shell重定向操作符,表示将命令的输出(即导出的SQL文件内容)重定向到一个文件。 -
abrbak_tables.sql
: 导出的SQL文件名,备份数据将被保存到这个文件中,文件扩展名.sql
表明它是一个SQL脚本文件。
综上所述,该命令的作用是从IP地址为xxx.xxx.x.xxx、端口为3307的MySQL服务器上,使用root用户和密码xxxxxx登录,并备份数据库abrbak
中的指定表(chat_log
, chat_session
, task_baseinfo
, abr_sms_task
, abr_call_task
, task_detail
)到本地的abrbak_tables.sql
文件中。
1.2 从容器内导出
# 先尝试用指定库的用户名导出指定库的数据
mysqldump -u xiaokkk -p xiaokkk > dump.sql
# 如果显示权限不足,用root用户进行导出
mysqldump -u root -p xiaokkk > dump.sql
特殊情况,如果root用户密码忘记了, 在/etc/my.cnf 中启用skip-grant-tables
会禁用MySQL的权限系统,使得任何用户都能够无需密码即可连接数据库并拥有全部权限,【这会带来严重的安全风险。因此,仅在解决特定问题(如找回丢失的root密码)时临时使用】
修改配置文件后,需要重启MySQL服务使改动生效。重启命令根据系统和服务管理方式会有所不同,常见的命令有:
sudo systemctl restart mysql
(Systemd系统)sudo service mysql restart
(Upstart或SysVinit系统)brew services restart mysql
(如果在macOS上通过Homebrew安装)
2、 数据导入
2.1 目标库准备
数据导入之前可能涉及删除目标库的表或者数据
# 直接删除表
select concat('drop table if exists ', table_name, ';')
from information_schema.tables
where table_schema = 'xiaokkk';
# 只删除数据
select concat('truncate table ', table_name, ';')
from information_schema.tables
where table_schema = 'xiaokkk';
2.2 执行导入
# 将备份文件复制到容器内部
docker cp /Users/xiaokkk/Desktop/abrbak_full_backup.sql fc20f2d2d321:/opt/abrbak_full_backup.sql
# 进入容器内部
docker exec -it fc20f2d2d321 /bin/bash
# 进入复制文件的目录
cd /opt
ls
# 确认文件复制成功后,需要固定在此目录,因为登录客户端后无法切换目录
mysql -u xiaokkk -p
# 查看有哪些库
show databases;
# 进入指定库
use xiaokkk
# 执行备份文件,执行前一定要看下文件use的哪个库,避免导致数据无法恢复
source abrbak_full_backup.sql
# 还有一种方式不用source
mysql -u xiaokkk -p xiaokkk < abrbak_full_backup.sql
3、注意事项
数据迁移是一个需要细心操作的工作,切不可大意,每次执行完对应操作后,需要确认无误后再进行下一步,主要注意事项如下:
1、注意迁移各项工作的顺序,建议如下:
- 导出原容器数据库数据,如果需要变换库名,请务必更改前几个库名,涉及create database\use database等处的语句;
- 上传到目标容器指定位置,一般为tmp或者opt;
- 请务必停掉和目标数据库相关的数据调度,防止锁表或者导致生产事故;
- 执行source,请务必确认已切换到指定库,防止更改了其他库数据;若为或者mysql - 的方式,请务必检查目标库参数,确认目标数据库库名正确;
- 检查数据导入是否无误,结束
2、若原库和目标库的数据结构不一样,可以创建一个新库,将原库数据清洗至新库,然后将新库数据导入目标库