客户的需求很简单:照原样帮我再复制一份到某某环境。这样漂亮简洁的一句话却并不意味着它的过程也是漂亮简洁的。
老范找到与客户线上运行系统版本一致的安装包,同时确认了自上线运行以来做的所有系统补丁文件的位置,三下五除二,就把一套一模一样的系统装到了新环境中。
在这里感谢公司完善的版本管理制度和补丁日志制度,让我顺利完成了这次系统迁移。
全剧终。
等等,事情要是这么简单,我还头秃个锤子。
库体迁移才是整个系统迁移的重点。很明显,系统迁移只是照原样搭建起了一座一模一样的“工厂”,之前的所有成果都还没搬进来呢。
好,开始库体迁移。老范的系统使用的是mysql库,前边部署系统时,已经通过自动化程序把数据库装好了。
第一步:在旧的系统上登录数据库,查看数据库详情。
两条命令:首先连接到数据库;第二,查看库体列表。
连接数据库
查看库体列表
查询后,老范发现自己需要迁移四个库体:ngse、ngse_data、ngse_pv、ngse_index。
第二步:库体导出
mysqldump是一条非常实用的库体导出命令。
当然了,执行mysqldump需要先断开上边对mysql的连接,直接输入exit,mysql会和你【say Bye】。
然后,执行如下的命令:
比如我的用户名是xiu,密码是shshsh,需要导出的库体是ngse,导出路径是/root/ngse.sql,那么就这么写:
mysqldump -uxiu -pshshsh ngse > /root/ngse.sql
第一个库体导出非常顺利,不一会就完成了。
注意,导出完成的标志是会话框回到了初始状态,并且没有任何ERROR输出(warning可以忽略)。这时候在/root/ 下,我们看到了一个文件:ngse.sql
初始状态
第三步:恢复库体
库体恢复的命令也很简单,就一句:
mysql -uxiu -pshshsh ngse < ngse.sql
执行结束,数据库就恢复到新的库上了。
欢乐的时光总是那么短暂。
如果真这么简单,我还头秃个锤子。
接连导出两个库体,麻烦来了。
突然报了这么一个错:意思是说你的这个文件包超出最大限制了,mysqldump没法给你导出这么大的文件。
老范一看,库体已经导出了60GB。按照网上说的在mysqldump命令中添加参数的说法试验了一次,毫无卵用。大部分网上的解决思路是扩大max_allowed_packet的值,但是我保证我想把他调到100GB,但是没成功,mysql直接说我这个值是不合适的。
老范想了又想,猜了又猜,这个事情不简单。
于是祭出终极杀器:物理拷贝。
系统迁移的终极大杀器是什么?老范的师父说,大道至简。直接把整台服务器的所有硬盘拆下来拷贝走,就可以一模一样的恢复到新机器上。
物理拷贝是一个大招。你不是导不出来么,我直接把你统统拷贝走可行了吧!
第一步:找到mysql的安装路径
一般情况下,mysql的安装路径就在/usr/local下,如果没有,可以使用命令去询问一下linux,命令很简单:whereis mysql,或者查看mysql.cnf文件
命令是 cat /etc/my.cnf
这里标记了文件存储位置
第二步:关闭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后存盘退出重启机器试试。
再启动就可以了。
最后来个彩蛋:如果数据库是docker容器的方式部署安装的呢?
如果docker容器是正常的,上面的方法同样可以使用。如果容器死球了,那就不奏效了,因为这时候你连容器都进不去,你备份啥。
再祭出一个大杀器:容器物理拷贝。
第一条命令:docker inspect mysqlContainerID
你会看到这么一块内容,其中source是mysql容器的物理绝对路径,destination是映射到容器里的路径。
图是mongodb的,一个意思
第二条命令:cp -r sourcepath yourpath
第三条命令:重新建一个mysql容器,把source文件映射到destination描述的路径下。
备份与恢复,齐活。