云mysql数据库迁移和docker容器访问的一些事

原创文章
声明:作者声明此文章为原创,未经作者同意,请勿转载,若转载,务必注明本站出处,本平台保留追究侵权法律责任的权利。
全栈老韩
全栈工程师,擅长iOS App开发、前端(vue、react、nuxt、小程序&Taro)开发、Flutter、React Native、后端(midwayjs、golang、express、koa)开发、docker容器、seo优化等。

最近云数据库快到期了,接下来我不想继续使用云数据库了,因为直接在我的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依然是我熟练使用且信赖的。当然大家可以使用自己顺手的可视化软件。

mysqlworkbench新增链接

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

如上图,红色框部分就是你需要创建的数据库名字。

五、导入数据

鼠标点击选中新建的那个数据库,然后点击左上角的导入sql文件按钮,选择在步骤中你导出的那个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的值。

以上就是这些,文章写长了确实有点累,请大家多多关注。

暂无评论,快来发表第一条评论吧