迁移MySQL数据库通常只需要几个简单的步骤,但是由于您要转移的数据量可能比较庞大,因此一般耗时也会比较长。
下面的步骤将指导您如何从旧的服务器上导出MySQL数据库,对它进行安全加固;然后将其复制并导入到新的服务器上,以保证数据的完整。
将MySQL数据库导出至转储文件(dump file)
Oracle提供了一个名为mysqldump的工具,允许您轻松地将数据库结构和其数据导出到一个SQL的转储文件。您可以使用如下的命令:
1.mysqldump -u root -p --opt [database name] >[database name].sql
不过,请注意如下几点:
我们可以使用--single-transaction的标志,以避免数据库在导出数据的过程中被锁死。这样能够在将数据导出到转储文件的同时,您仍可继续在旧的数据库上更新数据。不过请注意,那些在导出进程已经开始之后被更新的数据,是不会被导入转储文件之中的。
在运行该命令之前,请务必将[database name]替换成您的实际数据库名称。
请输入您自己的用户名和相对应的密码,并确保该用户具有备份数据库所需的权限。
安全加固备份文件
在大多数情况下,数据是一家企业的最重要的资产。因此,我们不希望数据库的各种备份被暴露在不受保护的服务器上,因为这样有可能会造成错误地泄露,甚至会出现被黑客窃取等更为糟糕的状况。
因此,通常您可以尝试的做法是:压缩、加密文件,然后删除原文件。在Linux *** 作系统上,请使用以下的命令对已压缩文件进行加密:
1.zip --encrypt dump.zip db.sql
在压缩开始之前,系统将提示您输入密码。
传输备份文件
至此,我们已经获得了一个加密的转储文件。下面让我们通过网络使用SCP命令,将其传输到新的服务器上:
1.scp /path/to/source-file user@host:/path/to/destination-folder/
将MySQL转储导入新服务器
通过上面一步,我们已将备份文件传到了新的服务器上,下面让我们来进行解密和提取:
1.unzip -P your-password dump.zip
为了存储空间和安全方面的原因,一旦文件导入成功,请记得删除其对应的转储文件。
您可以使用以下的命令来导入文件:
1.mysql -u root -p newdatabase </path/to/newdatabase.sql
在新服务器上验证导入的数据
现在我们在新服务器上已经导入了数据库,那么我们就需要一种方法来验证数据的真实存在,并确保没有任何遗漏。
我建议您同时在旧的和新的数据库上运行如下查询,并将获得的结果进行对比。
该查询会在所有的表里计算行数,以显示出新、旧数据库中的数据量。
1.SELECT
2.TABLE_NAME,
3.TABLE_ROWS
4.FROM
`
5.information_schema`.`tables`
6.WHERE
`
7.table_schema` = 'YOUR_DB_NAME';
此外,我建议您检查各个表中数字列的MIN和MAX记录,以确保数据本身是有效的,而不仅仅是看数据的总量(虽然这是查询所唯一能够读出的值)。另一种可供测试的选择是将数据库从新的服务器导出为SQL转储文件,并将其与旧服务器的SQL转储文件做比较。
此外,在应用程序被迁移之前,我建议您先将一个应用程序的实例重定向到新的数据库上,以确认一切运行正常。
另一种导出和导入的选项
我们之所以把该选项放在最后,是因为我们的确不建议您去使用它。
该方法实现起来非常的容易,因为它仅使用一个命令,便能一次性将转储文件导出、传输、并将其数据导入到新的数据库之中。
而它的不足之处在于,一旦其网络链接断掉,您就需要重新启动它了。
因此,我们认为它并不值得被推荐,尤其是在大型数据库中,可能会非常不适用。
当然,如果您非要尝试一下的话,可以使用如下的命令:
1.mysqldump -u root -pPassword --all-databases | ssh user@new_host.host.com 'cat - | mysql -u root -pPassword'
重要提示
请确保在新旧两处,安装有相同官方发行版本的MySQL服务器。否则,你需要按照MySQL网站上的升级说明来进行统一(请参见(https://dev.mysql.com/doc/refman/5.7/en/upgrading.html)。
请确保您在旧的服务器上拥有足够的空间来保存转储文件和压缩文件(应该有db_size×2的空间)。
请确保您在新的服务器上拥有足够的空间来保存加密的和解密的转储文件、并能导入数据库(应该有db_size×3的空间)。
如果您曾经考虑过只是将datadir从一个数据库转移到另一个的话,我建议您最好不要这样做。否则,您会搞乱数据库的内部结构,而且会给将来可能的问题埋下隐患。
在新的服务器配置中,请不要忘了配置诸如innodb_log_file_size这样的重要标志。因为如果忘记了根据新服务器的规格而更新配置的话,很可能会导致严重的性能问题。
在许多情况下,一般升级到新的数据库服务器的初衷是为了提高查询性能。而如果此类升级没有达到预期的改善,那么您就应该考虑去优化SQL查询,而不仅仅是升级硬件那么简单了
于项目升级或者服务器更换,需要将数据从一个数据库服务转移到另一个数据库服务中。两个数据库所在的服务器的公网IP分别为x.x.x.x和y.y.y.y。进行MySQL数据迁移之前,需要做一些准备工作,即两台服务器上配置相同环境。需要在公网IP分别为x.x.x.x和y.y.y.y的服务器上都安装mysql-5.7.37。
准备工作
第一步,下载mysql-5.7.37。
第二步,配置mysql。
第三步,安装mysql-5.7.37。
第四步,远程连接另一台服务器上的mysql。
第五步,不进入mysql根目录即可进行相应的 *** 作。
MySQL数据迁移常用方法
MySQL数据迁移一般可分为物理迁移和逻辑迁移。
物理迁移适用于海量数据整体迁移,可以直接复制数据文件或使用navicat来进行备份迁移。不同的服务器之间采用物理迁移需要将两台服务器中的MySQL server保持完全一样的版本、配置和权限。这种物理迁移优点是速度快,缺点是要求新服务器与原服务器配置完全一致,即便如此也有可能引起一些未知错误。
如果规模较小,业务也并不繁忙,推荐使用mysqldump即逻辑迁移法,它相对来说更轻巧、稳健一些。mysqldump的原理是在导入到新数据库时,先将原数据库表结构使用CREATE TABLE 'table'语句创建,然后在使用INSERT将原数据导入至新表中。可以理解为一个批量导入脚本。这样按照规范命令导入数据,大幅减少奇怪的未知错误出现。
第一种方案:物理迁移-使用navicat
第一步,下载并安装Navicat。
到网址https://www.navicat.com/en/download/navicat-premium下载需要的Navicat软件,之后在Windows系统中安装。安装成功后,然后进行数据库连接。
第二步,选择要导出的数据库ZJZK2022,格式为.sql。
具体 *** 作:选中ZJZK2022,然后右键:转储SQL ->结构+数据 ->选择路径。得到需要的.sql文件。
第三步,将.sql文件导入新服务器数据库中。
如果根据已有的SQL文件执行数据导入,那么可以直接在打开一个数据库后,新建一个查询窗口,然后将sql文件中的内容粘贴到窗口中执行即可,这种方式同时适用于单表数据导入与数据库整体导入。
如果想要进行整个数据库的数据导入,也可以直接选中新服务器IP,右键:运行SQL。然后选择之前导出的数据库sql文件,最后点击“开始”。可以得到与之前服务器数据库中相同的数据。
第二种方案:逻辑迁移-使用mysqldump
登录远程服务器,在服务器中导出数据库
第一步,登录公网IP为x.x.x.x的阿里云ECS服务器。
第二步,将需要迁移的原数据库ZJZK2022中的数据导出,生成*.sql文件。
命令:service mysql start
/mnt/mysql/mysql-5.7.37/bin/mysqldump -u root -p --opt ZJZK2022 >/tmp/ZJZK2022-data-export.sql
然后输入登录密码“123456”。
执行mysqldump命令后,若没有报错,则shel不会有任何结果显示。
注释:ZJZK2022——本次准备迁移的数据库;
/tmp/ZJZK2022-data-export.sql——导出时生成的数据文件存放的位置与文件名;
--opt——此命令参数开启代表着同时激活了quick、add-drop-table、add-locks、extended-insert和lock-tables 参数;
quick——忽略缓存,直接将数据导出到*.sql文件中;
add-drop-table——在每个CREATE TABEL命令之前增加DROP-TABLE IF EXISTS语句,防止数据表重名;
add-locks——在备份数据表前后添加表锁定与解锁 SQL 语句;
extended-insert——此参数表示可以多行插入,提高导入效率,开启与否导入效率相差数倍,推荐开启。
第三步,进入导出目录查看导出结果。
命令:cd /tmp
ls
若结果显示ZJZK2022-data-export.sql,则说明文件已经生成。
无服务器,独立MySQL数据库远程导出至本地计算机
如果在阿里云购买的不是一台服务器,而是一个独立MySQL数据库的话,那也可以将数据库导出至本地计算机。
命令:service mysql start
/mnt/mysql/mysql-5.7.37/bin/mysqldump -h y.y.y.y -u ZJZK2022-remote -p -P3306 --default-character-set=utf8 --set-gtid-purged=OFF --column-statistics=0 ZJZK2022 >/Desktop/ZJZK2022-data-export.sql
注释:y.y.y.y——远程数据库ip地址;
ZJZK2022-remote——拥有远程访问权限的数据库账号;
-P 3306——数据库访问端口,可根据自己情况修改;
default-character-set=utf8——导出时指定字符集;
set-gtid-purged=OFF——全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力。开启这个功能导入导出时,可能会出错,故关闭;
/Desktop/ZJZK2022-data-export.sql——本地计算机保存路径及保存文件名。
提示:mysqldump常见报错:mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')
可在命令中添加column-statistics=0参数。因MySQL数据库早期版本information_schema数据库中没有名为COLUMN_STATISTICS的数据表,新版mysqldump默认启用,我们可以通过此命令禁用它。
执行命令后,若没有报错,则shel不会有任何结果显示,但已经可以在桌面上看到导出后生成的文件。
复制 *.sql 至新数据库/新服务器
使用WinSCP将导出的*.sql文件传送到内网IP为y1.y1.y1.y1的新服务器对应的路径中。
命令:scp /tmp/ZJZK2022-data-export.sql root@y1.y1.y1.y1:/tmp/
输入连接root@y1.y1.y1.y1的密码“654321”。
若结果显示“WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED”,则说明出现错误。可以使用命令“ssh-keygen -R y1.y1.y1.y1”,然后重新尝试连接,输入yes,按下回车,成功连接。
若结果显示“ZJZK2022.sql 100% 7191 2.6MB/s 00:00”,则说明数据传送成功。
如果购买的是独立MySQL数据库的话,也可以直接在阿里云服务器中直接向新服务器MySQL数据库导入数据。
导入数据库
方法一:本地数据库*.sql文件导入
第一步,当数据传输到公网IP为y.y.y.y的服务器后,可以在此服务器上新建一个名为ZJZK2022_new数据库,然后使用mysql命令直接导入数据库。
要将*.sql导入到数据库中,首先以root或有足够权限的账号登录MySQL。
命令:service mysql start
cd /mnt/mysql/mysql-5.7.37/bin
./mysql -u root -p
然后输入登录密码“123456”,就可以进入MySQL shell状态。
接着创建一个名为ZJZK2022_new的新数据库。
命令:mysql>CREATE DATABASE ZJZK2022_new
若执行命令后返回内容显示“Query OK, 1 row affected (0.00 sec)”,则说明新数据库创建成功。
然后使用“CTRL+D”退出MySQL shell。
最后导入数据库文件/tmp/ZJZK2022-data-export.sql。
命令:/mnt/mysql/mysql-5.7.37/bin/mysql -u root -p ZJZK2022_new </tmp/ZJZK2022-data-export.sql
若运行成功,则命令行不会有任何提示。
若运行失败,则命令行会提示失败原因。
注释:root——可以登录数据库的用户名;
ZJZK2022_new——刚刚新建的空数据库,数据会导入到该数据库中;
/tmp/ZJZK2022-data-export.sql——之前导出的sql文件,把它再导入到新数据库中。
第二步,要检测是否导入成功,可以登录到MySQL查看并检查数据库中的数据。
命令:cd /mnt/mysql/mysql-5.7.37/bin
./mysql -u root -p
然后输入登录密码“123456”,就可以进入MySQL shell状态。
# 选择刚刚导入数据的新建数据库
mysql>USE ZJZK2022_new
# 查看数据库中包含的表
mysql>SHOW TABLES
# 打开表查看内容
mysql>SELECT * FROM users
若结果显示的内容与公网IP为x.x.x.x的服务器中的数据库的内容一致,则说明mysql数据迁移成功。
方法二:在阿里云服务器中,直接远程将数据导入至新服务器
如果购买的是独立数据库的话,那么就没办法先把*.sql存过去,再导入。所以我们可以直接在阿里云服务器上发起导入 *** 作,直接导入至新服务器。
命令:/mnt/mysql/mysql-5.7.37/bin/mysql -h ZJZK2022_new -u root -p -P10010 ZJZK2022_new </tmp/ZJZK2022-data-export.sql
注释:ZJZK2022_new——新服务器MySQL数据库地址;
-P——数据库端口。
数据导入至新服务器MySQL,命令执行成功后,并不会有任何提示。登录新服务器数据库可以看到迁移结果。
远程登录新服务器MySQL,查看导入情况。
公网IP分别为x.x.x.x和y.y.y.y的服务器都已经安装好了mysql数据库。
忘记MySQL的登录密码,通过重置密码解决
命令:cd /mnt/mysql/mysql-5.7.37/bin
./mysql -u root -p123456
若结果显示“ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)”,则说明mysql的root用户密码错误,需要重置密码,然后用新密码重新登录数据库。具体做法如下:
1)停止mysql数据库。
命令:service mysql stop
2)新建文件夹/usr/local/mysql/data。
命令:mkdir -p /usr/local/mysql/data
3)启动mysql,并以不检查权限的情况下启动。
命令:mysqld --skip-grant-tables &
mysqld --user=root --skip-grant-tables &
4)登录mysql,修改密码,刷新权限。
命令:mysql -uroot
mysql>UPDATE mysql.user SET Password=PASSWORD('123456') where USER='root'
mysql>flush privileges
mysql>exit
5)重启之后输入“mysql -uroot -p123456”即可进入mysql。
不进入mysql根目录即可进行相应的 *** 作
第一步,在两台服务器上都配置环境变量。
在文件/etc/profile中添加下面的代码:
export PATH=$PATH:/mnt/mysql/mysql-5.7.37/bin
# 使profile文件生效
命令:source /etc/profile
# 导出数据
mysqldump -u root -p --opt ZJZK2022 >/tmp/ZJZK2022-data-export.sql
# 导入数据
mysql -uroot -p123456
mysql -u root -p ZJZK2022_new </tmp/ZJZK2022-data-export.sql
mysql -h ZJZK2022_new -u root -p -P10010 ZJZK2022_new </tmp/ZJZK2022-data-export.sql
第二步,在公网IP为y.y.y.y的服务器中将需要迁移的原数据库ZJZK2022中数据导出,生成*.sql文件,生成的文件仍在本服务器中。
1)可以在文件夹/mnt/mysql中创建一个名为mysql_export的脚本。
脚本代码如下:
# 执行MySQL命令 #!/bin/bash export MYSQL_PWD='123456' /mnt/mysql/mysql-5.7.37/bin/mysqldump -u root -p --opt ZJZK2022 >/tmp/ZJZK2022-data-export.sql
2)把启动脚本放到开机初始化目录
命令:cp /mnt/mysql/mysql_export /etc/init.d/mysql_export
#赋予可执行权限
命令:chmod +x /etc/init.d/mysql_export
#添加服务
命令:chkconfig --add mysql_export
#启动mysql_sign服务
命令:service mysql_export start
展开阅读全文
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)