记一次docker mysql 数据库迁移过程

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的安装目录了

将数据导入到目标数据库

  1. 首先使用docker拉取一个mysql的镜像。关于docker指令的介绍可以参见之前的文章------Docker入门—docker常用操作指令及运行第一个容器。(PS:由于小编实际操作的时候,虚拟机上已有一个5.7版本的实例,就没有再去拉取一个5.6版本的镜像,同时也是想试试两个不同版本之间迁移的时候会不会遇到什么问题。)
  2. 在宿主机创建以下的文件夹,用作运行mysql镜像时和镜像之间建立映射
    • mkdir -p /opt/docker-mysql/conf
    • mkdir -p /opt/docker-mysql/data
    • mkdir -p /opt/docker-mysql/logs
  3. 执行以下命令,将镜像运行起来。
    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 
    
  4. 将第一步生成的esb_console_db_dev.sql上传到宿主机/apps/Download目录下,然后通过指令docer cp /apps/Download/esb_console_db_dev.sql mysql镜像ID:/home将导出的sql脚本复制到容器内部的/home目录下
  5. 执行命令docker exec -it mysql镜像ID /bin/bash进入容器内部
  6. 执行命令mysql -u root -p连接上mysql
  7. 创建同名的数据库create database esb_console_db_dev;
  8. 切换数据库use esb_console_db_dev;
  9. 执行命令开始导入source /home/esb_console_db_dev.sql;
  10. 至此,数据库的迁移就完成了

但是事情肯定没有那么顺利,因为在使用的时候发现,导入到容器中的数据中文存在乱码。

问题解决方案

中文乱码问题

中文乱码十有八九是字符集出了问题,我们进入到容器内部,连接上mysql后,执行命令show variables like "%char%";来查看数据库当前的字符集。如图所示:记一次docker mysql 数据库迁移过程_第1张图片
那么下面开始设置字符集。
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

  1. 保存之后,重启mysql镜像,重新查看下字符集,就可以看到字符集已经更正过来了,如下图所示:记一次docker mysql 数据库迁移过程_第2张图片
  2. 然后重新导入下就可以了。

你可能感兴趣的:(Docker)