场景
- 新系统上线,将测试系统mysql中的数据导入到新的系统中。
错误准备操作
Mysqldump下载备份
mysqldump -uroot -p zz > /backup/mysqldump/zz.sql
Scp传输文件
scp -r zz.sql root@192.168.158.201:/backup
如果对方没有这个数据库先创建数据库
mysqladmin -uroot -p create db_name
如果有的话直接传入
mysql -uroot -p db_name < /backup/mysqldump/db_name.db
检查数据库是否全备份
碰到的问题
1. 数据量过大,最大的表导出后有23G
2. 数据传输问题,因为测试环境和正式环境不通,需要先传到我的笔记本本地,再从本地上传到正式环境。速度过慢
3. 传输过程受网络影响可能会断掉
4. 大数据传输提前优化要做好
操作流程
一:前期分析
- 分析数据大小:
查询数据库大小:先进入information_schema表
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='hdshop';
查询表格行数:
select count(*) from table;
查询表格大小:先进入information_schema表
select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='数据库名称' AND table_name='表名称';
如果数据库大小小于3G可正常mysqldump下载再上传传入
- 查询可能优化的方法
参考一下链接:
> https://blog.csdn.net/qq_25518029/article/details/120200073
- Mysql相关用法
登录:
mysql -u -p -h id -p 端口 -A
-A参数解释如下
https://blog.csdn.net/weixin_35728636/article/details/113341829
二:碰到的问题
- 数据表过大,mysqldump花费十几分钟时间还好,但是要导入到本地再从本地导入到服务器,这个中间时间太长
刚开始时采用的以上方法,发现60G左右的东西来回折腾要一天,所以决定还是寻找新的方法,方法如下:
方法一:
进行压缩再传入本地,这个具体尝试,因为可能存在压缩后数据丢失问题以及压缩后大小变化不大,效果不显著。
方法二:
找到服务器,mysqldump后使用u盘来进行导入。这个也没有尝试是后面自己的想法
方法三:
去机房找到物理机,然后连接后拉到本地笔记本。但是存在如下问题:
1:该服务器只有一个网口且被占用,无法通过网线链接。如果可以链接的话,操作流程如下
修改自己电脑ip进入同一局域网,如果可以ping通的话,使用CRT建立新的连接,或者ssh命令:ssh用户名@ip -p(此处记录下ssh是-p,scp是-P);
2:通过管理口进入,已经正常进入,但是root密码当时不正确,正常流程是,进入后将文件拉取到本地:可用SCP应该是
方法四:
最终也是最快最有效的方法,先将这个机器传到跳板机上,再从跳板机中转传一下。使用命令scp:
将文件从远程系统复制到本地系统:
$ scp [option] user@server-ip:/path/to/source/file /path/to/local/directory
将文件复制到远程 Linux 服务器:
$ scp [option] /path/to/source/file user@server-ip:/path/to/destination/directory
[option]各参数内容:
` -C - 这会在复制过程中压缩文件或目录。
-P - 如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口。
-r - 此选项递归复制目录及其内容。
-p - 保留文件的访问和修改时间。`
此处有一个问题是,为什么往本地拉取很慢,但是走网线scp就很快,是网速的原因还是其他原因。
分析大概如下:
1:因为从服务器下载到我的本地笔记本再从本地笔记本上传到另一台服务器要走的是wifi网络,需要经过很多路由,此处查询有一个是共享网络文件的方法:
> https://www.jianshu.com/p/a96188a8707c
2:服务器之间传输直接走的就是网线,相当于两个机器在同一网络且用线传输,类比于同一机柜机器传输很快
教训就是传输大文件时,能在同一机柜就同一机柜,不然就同一网络,我这种跨网络,走多个路由的就很慢。
- 导完最后上传到正式环境服务器上后,source导入表也很慢,存在两个问题。一:导入多个表需要一个一个传?二是:数据过大需要挂到mysql后台:
方法一:
如果是直接导入整个数据库可以用如下命令:
如果对方没有这个数据库先创建数据库
mysqladmin -uroot -p create db_name
如果有的话直接传入
mysql -uroot -p db_name < /backup/mysqldump/db_name.db
解决一的问题:可以写一个all.sql文件,将每个表的source命令写入,参考如下可,其中也提到了优化
> https://wenku.baidu.com/view/3d11872851ea551810a6f524ccbff121dd36c567.html
方法二:
解决二的问题:当时导入一个表太大,导入之间太久,此时想重新打开一个窗口导入,发现提示这个:
mysql> use dbname
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
这个原因是:当我们打开数据库,,即use dbname时,要预读数据库信息。由于数据库太大,即数据库中表非常多,所以如果预读数据库信息,将非常慢,所以就卡住了,如果数据库中表非常少,将不会出现问题。
加个-A参数就好了,直接进去导。
接下来讨论下如何将source或者说mysql的进程导入后台:
比较全的后台运行命令:
https://www.csdn.net/tags/MtzaIg0sMzk0MTUtYmxvZwO0O0OO0O0O.html
总结: 命令后加&是后台运行,但是无法退出终端
nohup 命令你个 & 是可以退出终端
也可以写个指向将日志输入
1:在开始导入前写个脚本挂在后台导入
https://www.csdn.net/tags/OtTaQg3sNDY5NzUtYmxvZwO0O0OO0O0O.html
https://wenku.baidu.com/view/a8f95b0a7075a417866fb84ae45c3b3567ecdda6.html
2:已经在mysql里面进行source导入了,进行如下操作:
https://blog.csdn.net/xiaoma19961101/article/details/119749486
总结就是: ctrl+z暂停正在运行的进程,此时已经挂在了后台,此程序前面有他的排序编号
jobs可查看在后台暂停的进程
bg 编号 将它挂在后台运行 :bg 1/2/3 代表不同的任务
fg 编号 可以唤醒到前台
- 导出后为什么大小不一致:
数据库是否有触发器/程序?如果您没有通过具有触发器/过程权限的用户导出文件,则它们将不会包含在导出中。
默认情况下也会跳过例程,触发器通常只由root用户导出。
在使用mysqldump备份的时候,可以使用lock-tables,lock-all-tables,single-transaction三个参数来控制表的一致性问题。lock-tables和lock-all-tables都是通过显示的加上只读锁来确保表的一致性。只有single-transaction通过MVCC来确保表的一致性,并且可以并发的执行DML和DDL。大家在备份的时候一定要先了解自己备份的具体需求和备份实例可以接受什么样的影响,小心的选择这三个参数。
总结:
一定要提前预估进行操作的大小以及可能花费的时间,找好最优的方法。如果碰到问题,无法操作或者慢的问题要及时解决。静下心来认真查询看文档。