mysql 数据库迁移小记

项目原因,需要进行 mysql 数据库从机器 A 到机器 B的迁移。中间遇到了一些问题并解决,主要流程如下:

1)原机器 A 上进行 sql 文件导出;

2)新机器 B 上进行 sql 文件导入;

3)验证数据库迁移后生效。

没错,就是一个“把大象放冰箱”的三步走策略,在此将中间过程涉及到的一些知识点小结记录。

一、sql文件导出

此处通过 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' > 导出的文件名

二、sql 文件导入

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”问题解决

mysql 数据库迁移小记_第1张图片

相关业务逻辑为向数据表中插入一条数据,但通过平台执行该逻辑时报错如上。在数据库中执行该 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的值,问题得解。此字段是调整服务端向客户端传输数据的超时时间。

 

 

 

 

你可能感兴趣的:(mysql 数据库迁移小记)