云mysql数据库迁移和docker容器访问的一些事
最近云数据库快到期了,接下来我不想继续使用云数据库了,因为直接在我的centos docker云服务器上直接创建一个mysql容器,然后再使用MySQLWorkbench官方的mysql可视化软件,就可以直接操作数据库了,不必要额外的开销。当然如果是公司要求或者需要优化数据库的访问等要求,云数据库还是必要的。
一、云数据库数据迁移
我之前已经在文章https://www.xinwei.ltd/article/153已经明确的写过了如何在数据库之间迁移数据的做法,大家可以参考那篇文章进行数据库的数据导出,导出的一些勾选项,大家参照那篇文章的截图即可。
这篇文章不做详细的解释了。
二、创建docker数据库容器
根据我的习惯,我依然喜欢使用docker-compose.yml文件来创建容器,因为真的很方便,这里我展示一下我的docker-compose.yml中mysql部分的内容:
docker-compose.yml
...
mysql:
image: mysql:5.7
container_name: xxx_mysql
restart: always
ports:
- xxx:3306
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: "xxx"
...
- 其中
xxx部分改成你自己的端口port和数据库密码,端口需要在云服务器的防火墙的地方进行端口访问配置,保证外部可以访问到那个端口号。 volumes目录挂载,必须做一个目录挂载,保证数据库数据不会因为容器的异常或者销毁,从而丢失数据。【非常重要、非常重要、非常重要!】- 这里要注意
container_name的配置,定义一个你想要的容器名,后面会用到。
三、创建并启动mysql容器
如果你的docker-compose.yml中已经有创建或者启动过其他容器,现在只新增或者修改了一下mysql这个容器,那么不要直接执行docker compose up(老版本命令) 或者docker-compose up,这样会重建之前的容器,当然如果你不在乎之前容器的重建、重启等造成的服务暂时中断,那么直接执行这个命令也是可以的。
推荐在云服务器的docker环境中执行单独创建/重启mysql容器:
docker terminal
docker compose up -d mysql
这里的mysql就是你在docker-compose.yml中配置的service id,就是上面文件中的那个mysql。
执行上面的命令后,就可以让mysql跑起来了。
3.1 mysql的密码不对
如果你之前在当前docker环境下,已经创建过mysql容器,密码不是你现在yml文件中配置的这个,会导致你docker-compose.yml文件中的mysql容器重建/重启后,密码不统一的问题,原因是mysql会缓存之前的密码到你的挂载目录中,即使mysql容器重新修改了environment中的数据库密码,但还是不会生效的。
这个场景可能不会出现,但是如果出现,你可以使用docker命令docker exec -it xxx bash进入到你的mysql容器,执行mysql命令修改密码:
mysql docker 内部terminal
# 登录MySQL(用旧密码123456)
mysql -uroot -p123456
# 修改root密码为新值(abcd123)
ALTER USER 'root'@'%' IDENTIFIED BY 'abcd123';
或者,你清空挂载目录./mysql/data下的所有文件,重新docker restart xxxmysqlContainerId,这个操作前提需要你确保之前的mysql可以完全重建,且数据不重要的情况下。
四、使用MySQLWorkbench
不管市面上数据库可视化软件多么眼花缭乱,mysql官方的数据库可视化软件MySQLWorkbench依然是我熟练使用且信赖的。当然大家可以使用自己顺手的可视化软件。

创建一个数据库,用于将sql文件的执行数据导入到这个数据库。
(数据库的名字最好和云数据库中的数据库名字统一,避免代码改动的太多)

如上图,红色框部分就是你需要创建的数据库名字。
五、导入数据
鼠标点击选中新建的那个数据库,然后点击左上角的导入sql文件按钮,选择在步骤一中你导出的那个sql文件。

导入sql文件后,点击闪电⚡️按钮执行sql文件就好:

接下来你右键并刷新你的数据库,就可以看到所有的table表都存在了,所有的数据记录也都在里面。
六、代码中直接访问mysql docker
以前我们是云数据库的情况下,和数据库建立连接,都要通过外网或者内网的数据库ip地址,去创建数据库连接,现在我们是在centos docker云服务器环境下,有docker环境,那么在这同一个主机的docker环境中,一个容器访问另一个容器,是可以直接通过容器名字代替ip访问的。
即你可以将容器名字当作ip使用。
如果你熟练docker的相关知识的话,你应该知道可以这么使用。
比如我之前配置的数据库地址,修改为docker容器间的访问时,文件内容如下:
db.go
package config
const (
// mysqlIp string = "127.0.0.1" // 本地docker数据库
// 线上
mysqlIp string = "xxx_mysql"
)
const (
// mysql的host
MysqlIp string = mysqlIp + ":3306"
// mysql的root
Mysql_Root string = "root"
// mysql的密码
// Mysql_Pwd string = "123456" // 本地docker mysql测试密码
Mysql_Pwd string = "abcd123" // 线上密码
// 数据库名
Mysql_Db_Name string = "xxx_db"
)
上面的mysqlIp变量的值就是,就可以直接写上docker-compose.yml中你定义的那个container_name的值。
以上就是这些,文章写长了确实有点累,请大家多多关注。
暂无评论,快来发表第一条评论吧