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鏡像,重新查看下字符集,就可以看到字符集已經更正過來了,如下圖所示:
- 然後重新導入下就可以了。