一台老服务器用了5年了。为了保证稳定性,在它出毛病之前,预先换台新服务器。
本文记录了服务器迁移的全部过程。
本文档参考了本文的大纲:
同时在实践工作中,加入了自己的方法和经验。
全部内容分为以下几部分
- 建立用户
- 复制网站目录
- 修改本地hosts文件,准备测试
- 安装所有必要程序
- 复制程序配置文件
- MySQL数据迁移
- MYSQL数据迁移后,原主机上数据有更新怎么办?
- MYSQL数据迁移后,如何验证数据相符?
- 拷贝常用管理脚本
- 拷贝crontab
建立用户
对照老机器上 vi /etc/passwd
在新机器上逐个 useradd
复制网站目录
文件很多,用rsync吧。算法比scp智能。
rsync -PaAz -e 'ssh -p PORTNUMBER' /var/www/html/ [email protected]:/var/www/html/
如果多次复制,需要删除不用文件,加上 –delete。
修改本地HOSTS文件,准备测试
对照/etc/httpd/conf/httpd.conf中,每个虚拟主机域名,在本机hosts文件中,指向新主机的IP地址。
以便后面连到新主机上逐个测试每个网站。
安装所有必要程序
安装apache, php, mysql, vsftpd等。详细记录见:https://dingxuan.info/wp/?p=327
有几个程序要注意更新SELINUX设置,例如:setsebool -P allow_ftpd_full_access 1
复制配置文件
以apache配置文件为例:
scp -r -P 12345 /etc/httpd/conf [email protected]:/etc/httpd/
复制过去之后,记得把尚未安装的模块,先从配置文件中注释掉。
MYSQL数据迁移
迁移方法有很多种选择
- 保证两台机器mysql版本一样。停服务后直接copy数据文件。
速度快,但感觉有风险。 - mysqldump:
- MySQL Workbench
workbench有migration工具,但我的2G数据数导入导出很慢。最后还报出一堆错误。 - 试验多次,发现innobackupex 是最好用的。
命令格式:
innobackupex --host=localhost --user=root --password=passwd /root/mysqlbackup/ innobackupex --host=localhost --user=root --password=123456 --defaults-file=/etc/my.cnf /root/mybackup/xtrabackup/
示例:
[root@mysql data]# service mysqld stop [root@mysql data]# rm -rf /mydata/data/* [root@mysql data]# innobackupex --apply-log /root/mybackup/xtrabackup/2013-07-23_05-48-03/ #--apply-log 的意义在于把备份时没commit的事务撤销,已经commit的但还在事务日志中的应用到数据库 [root@mysql data]# innobackupex --copy-back /root/mybackup/xtrabackup/2013-07-23_05-48-03/ #--copy-back数据库恢复,后面跟上备份目录的位置 [root@mysql data]# chown -R mysql:mysql /mydata/data [root@mysql data]# service mysqld start #如果能启动代表恢复正常 [root@A1-2013 lib]# service mysqld start MySQL Daemon failed to start. Starting mysqld: [FAILED]
数据库没启来,查日志:
[root@A1-2013 lib]# vi /var/log/mysqld.log 131228 11:18:55 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql ^G/usr/libexec/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13) 131228 11:18:55 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 131228 11:18:55 InnoDB: Initializing buffer pool, size = 8.0M 131228 11:18:55 InnoDB: Completed initialization of buffer pool 131228 11:18:55 InnoDB: Operating system error number 13 in a file operation. InnoDB: The error means mysqld does not have the access rights to InnoDB: the directory. InnoDB: File name ./ibdata1 InnoDB: File operation call: 'open'. InnoDB: Cannot continue operation. 131228 11:18:55 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
SELINUX的问题:
在原来主机上查看:
[root@mysql data]# ll -Z /var/lib/mysql -rw-r----- mysql mysql system_u:object_r:mysqld_db_t ibdata1 -rw-r----- mysql mysql system_u:object_r:mysqld_db_t ib_logfile0 -rw-r----- mysql mysql system_u:object_r:mysqld_db_t ib_logfile1
在新主机上查看:
[root@mysql data]# ll -Z /var/lib/mysql</div> <div>-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1 -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0 -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile1 chcon -v --type=mysqld_db_t /var/lib/mysql chcon -v --type=mysqld_db_t /var/lib/mysql/* chcon -v --type=mysqld_db_t /var/lib/mysql/mysql chcon -v --type=mysqld_db_t /var/lib/mysql/mysql/* And so forth for any directories that you have under /var/lib/mysql
[root@mysql data]# chcon -R -u system_u -r object_r -t mysqld_db_t /var/lib/mysql/ [root@mysql data]#semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?" [root@mysql data]#restorecon -Rv /var/lib/mysql
MYSQL数据迁移后,原主机上数据有更新怎么办?
设置主从自动复制Replication。最简单的办法,跟着phpMyAdmin里的复制说明配置。
更详细的说明:
MYSQL数据迁移后,如果验证数据相符?
有mysqldiff等几种工具,最后选择workbench utilities中的mysqldbcompare
mysqldbcompare --server1=root:[email protected] --server2=root:passwd<a href="mailto:@2.2.2.2">@2.2.2.2</a> DevNewAge:DevNewAge --run-all-tests --changes-for=server2 --difftype=sql
提示中出现错误。
mysqldbcompare ERROR: Query failed. 23 (HY000): Out of resources when opening file <a href="http://forums.cpanel.net/f354/upgrade-mysql-5-5-sqlstate-hy000-general-error-23-out-resources-286172.html">http://forums.cpanel.net/f354/upgrade-mysql-5-5-sqlstate-hy000-general-error-23-out-resources-286172.html
拷贝常用管理脚本
rsync -PaAz -e 'ssh -p 123456' /root/scripts [email protected]:/root/
拷贝crontab
假设你和我一样,只在一个用户里设了crontab,分别在新旧两台机器上:
crontab -e
拷贝内容。