[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fjkRZsMerWKADZOvEaniHvKTqxq9oml_1z3DOJOcnwt0":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":28,"notice":28,"visitCount":29,"commentCount":30,"keywords":31},180,"2026-02-06T10:06:39.606Z","云mysql数据库迁移和docker容器访问的一些事","\n最近云数据库快到期了，接下来我不想继续使用云数据库了，因为直接在我的`centos docker`云服务器上直接创建一个mysql容器，然后再使用`MySQLWorkbench`官方的mysql可视化软件，就可以直接操作数据库了，不必要额外的开销。当然如果是公司要求或者需要优化数据库的访问等要求，云数据库还是必要的。\n\n## 一、云数据库数据迁移\n我之前已经在文章[https://www.xinwei.ltd/article/153](https://www.xinwei.ltd/article/153)已经明确的写过了如何在数据库之间迁移数据的做法，大家可以参考那篇文章进行数据库的数据导出，导出的一些勾选项，大家参照那篇文章的截图即可。\n这篇文章不做详细的解释了。\n\n## 二、创建docker数据库容器\n根据我的习惯，我依然喜欢使用`docker-compose.yml`文件来创建容器，因为真的很方便，这里我展示一下我的`docker-compose.yml`中mysql部分的内容：\n```docker-compose.yml\n...\nmysql:\n    image: mysql:5.7\n    container_name: xxx_mysql\n    restart: always\n    ports:\n      - xxx:3306\n    volumes:\n      - ./mysql/data:/var/lib/mysql\n      - ./mysql/conf/my.cnf:/etc/my.cnf\n    environment:\n      MYSQL_ROOT_PASSWORD: \"xxx\"\n...\n```\n- 其中`xxx`部分改成你自己的`端口port`和`数据库密码`，端口需要在云服务器的防火墙的地方进行端口访问配置，保证外部可以访问到那个端口号。\n- `volumes`目录挂载，必须做一个目录挂载，保证数据库数据不会因为容器的异常或者销毁，从而丢失数据。**【非常重要、非常重要、非常重要！】**\n- 这里要注意`container_name`的配置，定义一个你想要的容器名，后面会用到。\n\n## 三、创建并启动mysql容器\n如果你的`docker-compose.yml`中已经有创建或者启动过其他容器，现在`只`新增或者修改了一下mysql这个容器，那么不要直接执行`docker compose up`(老版本命令) 或者`docker-compose up`，这样会重建之前的容器，当然如果你不在乎之前容器的重建、重启等造成的服务暂时中断，那么直接执行这个命令也是可以的。\n\n推荐在云服务器的docker环境中执行单独创建/重启mysql容器：\n```docker terminal\ndocker compose up -d mysql\n```\n这里的mysql就是你在`docker-compose.yml`中配置的`service id`，就是上面文件中的那个mysql。\n\n执行上面的命令后，就可以让mysql跑起来了。\n\n### 3.1 mysql的密码不对\n如果你之前在当前docker环境下，已经创建过mysql容器，密码不是你现在yml文件中配置的这个，会导致你`docker-compose.yml`文件中的mysql容器重建/重启后，密码不统一的问题，原因是mysql会缓存之前的密码到你的挂载目录中，即使mysql容器重新修改了`environment`中的数据库密码，但还是不会生效的。\n\n这个场景可能不会出现，但是如果出现，你可以使用docker命令`docker exec -it xxx bash`进入到你的mysql容器，执行mysql命令修改密码：\n```mysql docker 内部terminal\n# 登录MySQL（用旧密码123456）\nmysql -uroot -p123456\n\n# 修改root密码为新值（abcd123）\nALTER USER 'root'@'%' IDENTIFIED BY 'abcd123';\n```\n\n或者，你清空挂载目录`./mysql/data`下的所有文件，重新`docker restart xxxmysqlContainerId`，这个操作前提需要你确保之前的mysql可以完全重建，且数据不重要的情况下。\n\n## 四、使用MySQLWorkbench\n不管市面上数据库可视化软件多么眼花缭乱，mysql官方的数据库可视化软件`MySQLWorkbench`依然是我熟练使用且信赖的。当然大家可以使用自己顺手的可视化软件。\n\n![mysqlworkbench新增链接](https://image.xinwei.ltd/image1770368577541.png)\n\n创建一个数据库，用于将sql文件的执行数据导入到这个数据库。\n（数据库的名字最好和云数据库中的数据库名字统一，避免代码改动的太多）\n![创建数据库](https://image.xinwei.ltd/mysqlworkbench_2.jpeg)\n\n如上图，红色框部分就是你需要创建的数据库名字。\n\n## 五、导入数据\n鼠标点击选中新建的那个数据库，然后点击左上角的导入sql文件按钮，选择在步骤`一`中你导出的那个sql文件。\n![导入数据sql](https://image.xinwei.ltd/sql_file.png)\n\n导入sql文件后，点击闪电⚡️按钮执行sql文件就好：\n![执行sql文件](https://image.xinwei.ltd/exe_sql.png)\n\n接下来你右键并刷新你的数据库，就可以看到所有的table表都存在了，所有的数据记录也都在里面。\n\n## 六、代码中直接访问mysql docker\n以前我们是云数据库的情况下，和数据库建立连接，都要通过外网或者内网的数据库ip地址，去创建数据库连接，现在我们是在`centos docker`云服务器环境下，有docker环境，那么在这同一个主机的docker环境中，一个容器访问另一个容器，是可以直接通过容器名字代替ip访问的。\n\n即你可以将容器名字当作ip使用。\n\n如果你熟练docker的相关知识的话，你应该知道可以这么使用。\n\n比如我之前配置的数据库地址，修改为docker容器间的访问时，文件内容如下：\n```db.go\npackage config\n\nconst (\n\t// mysqlIp string = \"127.0.0.1\" // 本地docker数据库\n\n\t// 线上\n\tmysqlIp string = \"xxx_mysql\"\n\n)\n\nconst (\n\t// mysql的host\n\tMysqlIp string = mysqlIp + \":3306\"\n\n\t// mysql的root\n\tMysql_Root string = \"root\"\n\n\t// mysql的密码\n\t// Mysql_Pwd string = \"123456\" // 本地docker mysql测试密码\n\tMysql_Pwd string = \"abcd123\" // 线上密码\n\n\t// 数据库名\n\tMysql_Db_Name string = \"xxx_db\"\n)\n\n```\n\n上面的`mysqlIp`变量的值就是，就可以直接写上`docker-compose.yml`中你定义的那个`container_name`的值。\n\n以上就是这些，文章写长了确实有点累，请大家多多关注。\n\n\n\n\n\n","这篇文章介绍一下我今天迁移云mysql数据库到docker数据库的一些事，希望对有的同学有帮助。","https://image.xinwei.ltd/image1770368577541.png",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",38,{"id":24,"name":26,"parentId":21},"数据库",[],"",179,0,"docker mysql, docker,mysqlworkbench, centos docker,数据库迁移,docker visit,docker的容器名访问, sql文件,golang mysql"]