标签归档:迁移数据库

博客被攻击导致下线 搬家时遇到的坑 迁移数据库文件要注意权限

昨天凌晨时博客被攻击了,峰值9000个连接,跑满了100Mbps网络端口,导致VPS的100G月流量在一个多小时内被跑光,然后VPS就被suspaned,网站下线不能访问。

我昨天早上发现博客不能访问,上去后台一看才知道这件事,搞不清楚我这个人畜无害的博客有什么好攻击的。

博客放在xvmlabs一段时间了,除了这次攻击导致下线之外一直比较稳定,也就没有想着把它迁移到更好的机器上。

既然发生攻击下线了,那就搬家吧,查看了下,我最近的一次备份是去年9月份,中间断档挺多的,xvmlabs suspaned之后不能从后台进入VPS进入机器进行备份操作,所以也无从取得最新的数据。不管怎么说,先恢复访问再说。就把之前的备份恢复吧。

一番折腾,把博客恢复访问了,回档到去年9月份。

然后去xvmlabs的论坛发贴求助,问在suspaned状态下怎么备份数据。在大概10个小时后客服回复,可使用快照把整个VPS上的数据都下载下来,好吧,我可能问了一个傻瓜问题。

今早去xvmlabs把快照下载下来,这种情况下是没有办法通过mysqldump或phpmyadmin导出数据库的,只能通过直接拷贝数据库文件进行覆盖操作。

我以为我是老司机了,即使之前没有进行过这样的操作问题也不大,然后,就遇到问题,解决这个问题花了我近一个小进的时间,为避免后来者遇到和我同样的问题,在这里把问题和解决方法说下,最后给出正确的操作方式。

我最开始是这样操作的(我的WEB SERVER是LNMP,如果你不是使用这个,可能相关路径和我不同,请注意作相应变动)


lnmp stop
mkdir snapshot && cd snapshot
wget http://107.182.xxx.xxx:8779/52xxx/snapshot-5xxxx.tar.gz
tar zxvf snapshot*.tar.gz
cd usr/local/mysql/var/
cp -rf "目标文件夹(即要迁移的数据库,全部迁移直接使用 * )" /usr/local/mysql/var/
chown -R mysql:mysql /usr/local/mysql/var/
chmod -R 644 /usr/local/mysql/var/

上面的这些命令,老司机可能知道问题所在了,先不要说出来,我说说我这样操作的遇到的问题

弄好之后就要启动lnmp了嘛,输入 lnmp start 我得出如下的错误输出

Starting MySQL
. * The server quit without updating PID file (/usr/local/mysql/var/v944.pid).

MYSQL启动不了了。。。。

LNMP的MYSQL默认没有记录错误日志,既然遇到问题了,要定位哪里出了问题,肯定就要开启日志

把这一行 log_error = /usr/local/mysql/error.log 加到 /etc/my.cnf[mysqld]项里开启错误日志

然后重新启动mysql lnmp mysql start 错误输出如下

180530 9:48:40 [ERROR] /usr/local/mysql/bin/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
180530 9:48:40 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)

找不到./mysql/host.frm ? google一下这个问题,说是没有读取权限。 我已经把备份恢复的文件所有人都改为mysql了,而且也给予了所有人读取权限了啊,怎么会这样?

打开另一台装lnmp的VPS,对比下两台VPS的var文件夹的权限有什么不一样,文件的权限没发现问题,文件夹的权限不一样,正常的那台VPS的文件夹权限是 drwx------,而不正常的这台是drw-r--r--,总算是发现问题了。。。

文件夹要有x(执行)权限,要不mysql用户根本无法进入这个文件夹,也是会出现找不到文件的错误了。

所以解决问题的方法就是给于文件夹x权限,上面那一行chmod -R 644 /usr/local/mysql/var/要改动一下,分别给于文件和文件夹不同的权限

最后,正确的命令是

lnmp stop
mkdir snapshot && cd snapshot
wget http://107.182.xxx.xxx:8779/52xxx/snapshot-5xxxx.tar.gz
tar zxvf snapshot*.tar.gz
cd usr/local/mysql/var/
cp -rf "目标文件夹(即要迁移的数据库,全部移直接使用 * " /usr/local/mysql/var/
chown -R mysql:mysql /usr/local/mysql/var/
find -type d /usr/local/mysql/var/ | xargs chmod 700
find -type f /usr/local/mysql/var/ | xargs chmod 644
lnmp start

一切正常,断档的那些内容都回来了~