项目原因,需要进行 mysql 数据库从机器 A 到机器 B的迁移。中间遇到了一些问题并解决,主要流程如下:
1)原机器 A 上进行 sql 文件导出;
2)新机器 B 上进行 sql 文件导入;
3)验证数据库迁移后生效。
没错,就是一个“把大象放冰箱”的三步走策略,在此将中间过程涉及到的一些知识点小结记录。
此处通过 mysqldump 进行 sql 文件导出,mysqldump 常用用法如下:
1)导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
2)导出某一张数据表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
3)导出数据库表结构,不包含表数据
mysqldump -u 用户名 -p 数据库名 -d --add-drop-table > 导出的文件名
或者
mysqldump -u 用户名 -p 数据库名 --no-data --add-drop-table > 导出的文件名
--add-drop-table 在每个create语句之前增加一个drop table,删除原有数据。
4)按照指定条件导出数据表
mysqldump -u 用户名 -p 数据库名 表名 -w 'id >=1 and id<=5' > 导出的文件名
1)启动 mysql 服务,创建数据库
CREATE DATABASE 数据库名;
2)选择数据库,导入数据。
use 数据库名;
source 原导出的 sql 文件路径
或者
mysql -u 用户名 -p 数据库名 < 原导出的 sql 文件路径
1)目标机器上有对应的数据表;
2)如果涉及到相关服务,服务流程能够完整运行且无异常。
1)使用SSH 隧道连接 mysql
本地机器A (ip:10.16.aaa.bbb)可访问机器 B(ip:10.16.ccc.ddd),但不能访问数据库机器 C(ip:10.16.eee.fff)。此时可将机器 B 作为跳板机,通过 ssh 端口转发实现在机器 A 上访问机器 C 上数据库的情况。
在本地机器 A 上执行如下命令:
ssh -g -f -NL 机器 A ip:指定端口a:机器 C ip: 机器 C数据库端口c 登录跳板机B的用户名@跳板机B ip;
如此即可通过如下命令在机器 A 上访问机器 C 上的数据库:
mysql -u db_username -h 机器 A ip -P 指定端口 a -p
ssh转发命令参数:
-g 允许远程主机连接本地转发的端口
-f 后台登录用户名密码
-N 不执行 shell,用于转发端口,一般与-g合用
-L port:host:hostport
将本地机(客户机)的某个端口转发到指定机器的指定端口。工作原理是这样的,本地机器上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和 host 的 hostport 端口建立连接。
2)“MySQL server has gone away”问题解决
相关业务逻辑为向数据表中插入一条数据,但通过平台执行该逻辑时报错如上。在数据库中执行该 insert 语句并无异常。后与开发沟通,怀疑和 MySql server 的响应等待时间有关系。在 MySql的配置文件 my.cnf (windows 上为my.ini)中查看发现当前配置下两个操作间隔时长超过 10s 后服务就会断开。更新 my.cnf 文件后问题得解,在此简单介绍下相关内容。
A:MySql server 的两种操作连接方式:
交互式连接:通过 MySql的客户端进行的各种 sql 操作,走的 TPC 协议;
非交互式连接:在项目中进行程序调用,例如 Tomcat web 服务器和数据库服务器的交互。java web 中一般通过jdbc 来连接。
所以,在我们的业务中用的应该是非交互式连接。
B:my.cnf 文件中的两个相关参数:
interactive_timeout:服务器关闭交互式连接前等待活动的时间,单位为秒。
wait_timeout:服务器关闭费交互式连接前等待活动的时间,单位为秒。
两个参数的默认值均为 28800(8 个小时),对于交互式连接,类似于 MySql 客户单连接,session和global 级别的 interactive_timeout 继承于global 级别 interactive_timeout 的值,而 wait_timeout 的值,session 级别继承了 interative_timeout,global 级别的 wait_timeout不受影响;对于非交互式连接,类似于 jdbc 连接,session和global 级别的wait_timeout继承于 global 级别的 wait_timeout的值。超时时间只以 session 级别的 wait_timeout为超时依据,global 级别只决定 session 初始化时的超时时长限制。
登录数据库后可以通过以下命令查看超时参数:
show global variables LIKE '%wait_timeout%';
3)接口请求返回 404
这个问题和 MySql 没有关系,但既然是在一个工作流中遇到了,就在此做简单记录。我所用的是一个内部开发平台,接口请求返回 404,经查代码实现逻辑没有问题。F12查看接口请求等待时长有 60s,怀疑是 http 请求时间超过了 NGINX 所配置的最大连接时间,服务器自动断开连接,并返回 404资源未找到的错误。
尝试更改 nginx.conf 配置文件中 send_timeout的值,问题得解。此字段是调整服务端向客户端传输数据的超时时间。