记一次docker mysql 数据库迁移过程
程序员文章站
2022-07-13 08:05:00
...
mysql数据迁移
环境说明
- 源数据库
一个在linux服务器上运行的5.6版本的Mysql - 目标数据库
一个在docker上运行的Mysql 5.7镜像
迁移过程
导出源数据
这里就需要引用的mysql官方的一个工具mysqldump,关于这个工具的详细使用可以自行百度,无非就是一些参数的配置。这里列出几个常用的配置
参数 | 含义 | 备注 |
---|---|---|
-h | 指定服务器IP地址 | 本机的时候可以省略 |
-P | 指定服务器端口 | 本机的时候可以省略 |
-u | 用户名 | |
-p | 密码 | |
–ignore-table | 导出时候排除的表 | 用法可以参见下面的实例 |
-default-character-set | 指定导出时用的字符集 | 用法可以参见下面的实例 |
由于数据库中的ESB_INSTANCE和ESB_INSTANCE_DETAIL中存在大量的大字段信息,并且只是一些日志数据,可以不用迁移过去,否则导出的文件会很大。导出语句如下:
./mysqldump -u root -p esb_console_db_dev > /home/mysql/esb_console_db_dev.sql --ignore-table=esb_console_db_dev.ESB_INSTANCE --ignore-table=esb_console_db_dev.ESB_INSTANCE_DETAIL --default-character-set=utf8
如果不知道mysql装在哪个目录下,执行指令ps -ef | grep mysql
,就可以看到mysql的安装目录了
将数据导入到目标数据库
- 首先使用docker拉取一个mysql的镜像。关于docker指令的介绍可以参见之前的文章------Docker入门—docker常用操作指令及运行第一个容器。(PS:由于小编实际操作的时候,虚拟机上已有一个5.7版本的实例,就没有再去拉取一个5.6版本的镜像,同时也是想试试两个不同版本之间迁移的时候会不会遇到什么问题。)
- 在宿主机创建以下的文件夹,用作运行mysql镜像时和镜像之间建立映射
mkdir -p /opt/docker-mysql/conf
mkdir -p /opt/docker-mysql/data
mkdir -p /opt/docker-mysql/logs
- 执行以下命令,将镜像运行起来。
docker run --name mysql -p 3306:3306 -v /opt/docker-mysql/conf:/etc/mysql/mysql.conf.d/ -v /opt/docker-mysql/data:/var/lib/mysql -v /opt/docker-mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=AAaa1234 -d mysql:5.7
- 将第一步生成的esb_console_db_dev.sql上传到宿主机/apps/Download目录下,然后通过指令
docer cp /apps/Download/esb_console_db_dev.sql mysql镜像ID:/home
将导出的sql脚本复制到容器内部的/home目录下 - 执行命令
docker exec -it mysql镜像ID /bin/bash
进入容器内部 - 执行命令
mysql -u root -p
连接上mysql - 创建同名的数据库
create database esb_console_db_dev;
- 切换数据库
use esb_console_db_dev;
- 执行命令开始导入
source /home/esb_console_db_dev.sql;
- 至此,数据库的迁移就完成了
但是事情肯定没有那么顺利,因为在使用的时候发现,导入到容器中的数据中文存在乱码。
问题解决方案
中文乱码问题
中文乱码十有八九是字符集出了问题,我们进入到容器内部,连接上mysql后,执行命令show variables like "%char%";
来查看数据库当前的字符集。如图所示:
那么下面开始设置字符集。
1.在宿主机中的/opt/docker-mysql/conf目录下新增文件mysq.cnf,并添加以下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
- 保存之后,重启mysql镜像,重新查看下字符集,就可以看到字符集已经更正过来了,如下图所示:
- 然后重新导入下就可以了。