mysql移动字段位置会丢失数据吗_centos写mysql光标移到上一行


mysql移动字段位置会丢失数据吗_解决方法_02


客户的需求很简单:照原样帮我再复制一份到某某环境。这样漂亮简洁的一句话却并不意味着它的过程也是漂亮简洁的。

老范找到与客户线上运行系统版本一致的安装包,同时确认了自上线运行以来做的所有系统补丁文件的位置,三下五除二,就把一套一模一样的系统装到了新环境中。

在这里感谢公司完善的版本管理制度和补丁日志制度,让我顺利完成了这次系统迁移。

全剧终。


mysql移动字段位置会丢失数据吗_mysql移动字段位置会丢失数据吗_03


等等,事情要是这么简单,我还头秃个锤子。

库体迁移才是整个系统迁移的重点。很明显,系统迁移只是照原样搭建起了一座一模一样的“工厂”,之前的所有成果都还没搬进来呢。

好,开始库体迁移。老范的系统使用的是mysql库,前边部署系统时,已经通过自动化程序把数据库装好了。

第一步:在旧的系统上登录数据库,查看数据库详情。

两条命令:首先连接到数据库;第二,查看库体列表。


mysql移动字段位置会丢失数据吗_mysql移动字段位置会丢失数据吗_04

连接数据库

mysql移动字段位置会丢失数据吗_centos写mysql光标移到上一行_05

查看库体列表

查询后,老范发现自己需要迁移四个库体:ngse、ngse_data、ngse_pv、ngse_index。

第二步:库体导出

mysqldump是一条非常实用的库体导出命令。

当然了,执行mysqldump需要先断开上边对mysql的连接,直接输入exit,mysql会和你【say Bye】。


mysql移动字段位置会丢失数据吗_centos写mysql光标移到上一行_06


然后,执行如下的命令:


mysql移动字段位置会丢失数据吗_mysql_07


比如我的用户名是xiu,密码是shshsh,需要导出的库体是ngse,导出路径是/root/ngse.sql,那么就这么写:

mysqldump -uxiu -pshshsh ngse > /root/ngse.sql

第一个库体导出非常顺利,不一会就完成了。

注意,导出完成的标志是会话框回到了初始状态,并且没有任何ERROR输出(warning可以忽略)。这时候在/root/ 下,我们看到了一个文件:ngse.sql


mysql移动字段位置会丢失数据吗_数据库_08

初始状态

第三步:恢复库体

库体恢复的命令也很简单,就一句:

mysql -uxiu -pshshsh ngse < ngse.sql

执行结束,数据库就恢复到新的库上了。

欢乐的时光总是那么短暂。


mysql移动字段位置会丢失数据吗_mysql移动字段位置会丢失数据吗_03


如果真这么简单,我还头秃个锤子。

接连导出两个库体,麻烦来了。

突然报了这么一个错:意思是说你的这个文件包超出最大限制了,mysqldump没法给你导出这么大的文件。


mysql移动字段位置会丢失数据吗_centos写mysql光标移到上一行_10


老范一看,库体已经导出了60GB。按照网上说的在mysqldump命令中添加参数的说法试验了一次,毫无卵用。大部分网上的解决思路是扩大max_allowed_packet的值,但是我保证我想把他调到100GB,但是没成功,mysql直接说我这个值是不合适的。


mysql移动字段位置会丢失数据吗_解决方法_11


老范想了又想,猜了又猜,这个事情不简单。

于是祭出终极杀器:物理拷贝。

系统迁移的终极大杀器是什么?老范的师父说,大道至简。直接把整台服务器的所有硬盘拆下来拷贝走,就可以一模一样的恢复到新机器上。

物理拷贝是一个大招。你不是导不出来么,我直接把你统统拷贝走可行了吧!

第一步:找到mysql的安装路径

一般情况下,mysql的安装路径就在/usr/local下,如果没有,可以使用命令去询问一下linux,命令很简单:whereis mysql,或者查看mysql.cnf文件

命令是 cat /etc/my.cnf

这里标记了文件存储位置


mysql移动字段位置会丢失数据吗_centos写mysql光标移到上一行_12


第二步:关闭mysql

service mysqld stop

第三步:拷贝文件

把源环境中拷贝出来的data文件复制到/var/lib/mysql下

注意,需要提前看一下这个路径下的空间是不是足够,如果不够,可以找一个空间大的位置存放data文件,只需要修改my.cnf就可以了。

第四步:重启mysql

service mysqld start

不出意外,你会启动成功。但是不出意外的可能性比较小,继续看:

错误一:提示文件没权限(类似于permission denied)

执行这条命令:

chown -R mysql:mysql /yourdatapath

错误二:MySql提示:The server quit without updating PID file(…)

以下来源于

MySql提示:The server quit without updating PID file(…)失败javawind.net

1.可能是/home/data/mysql 文件夹没有写的权限
解决方法 :给予权限,执行 “chown -R mysql:mysql /home/data/mysql” “chmod -R 755 /home/data/mysql” 然后重新启动mysqld!

2.可能进程里已经存在mysql进程
解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”杀死,然后重新启动mysqld!

3.可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。
解决方法:去mysql的数据目录/data看看,如果存在mysql-bin.index,就赶快把它删除掉吧,它就是罪魁祸首了。

4.mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,请打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir)。
解决方法:请在[mysqld]下设置这一行:datadir = /home/data/mysql

5.skip-federated字段问题
解决方法:检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。

6.错误日志目录不存在
解决方法:使用“chown” “chmod”命令赋予mysql所有者及权限

7.selinux惹的祸,如果是centos或redhat系统,默认会开启selinux
解决方法:关闭它,打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled后存盘退出重启机器试试。

再启动就可以了。


mysql移动字段位置会丢失数据吗_mysql移动字段位置会丢失数据吗_03


最后来个彩蛋:如果数据库是docker容器的方式部署安装的呢?

如果docker容器是正常的,上面的方法同样可以使用。如果容器死球了,那就不奏效了,因为这时候你连容器都进不去,你备份啥。

再祭出一个大杀器:容器物理拷贝。

第一条命令:docker inspect mysqlContainerID

你会看到这么一块内容,其中source是mysql容器的物理绝对路径,destination是映射到容器里的路径。


mysql移动字段位置会丢失数据吗_解决方法_14

图是mongodb的,一个意思

第二条命令:cp -r sourcepath yourpath

第三条命令:重新建一个mysql容器,把source文件映射到destination描述的路径下。

备份与恢复,齐活。