问题描述
我试图将我的MySQL数据库的数据目录移动到我作为挂载点/array2/的第二个磁盘阵列。
我遇到的问题是我已经尝试了一切,在我修改my.cnf中的datadir位置后,mysql将无法重新启动。
我得到的只是:
start: Job failed to start
最佳解决办法
忘了app盔甲。
对于任何有兴趣的人,我做了以下移动文件夹。
停止mysql服务器:
stop mysql
创建新目录:
mkdir /array2/mysql
仅复制数据库文件夹:
cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql
备份my.cnf文件:
cp /etc/mysql/my.cnf /root/my.cnf.backup
编辑my.cnf文件:
nano /etc/mysql/my.cnf
将旧datadir和套接字的所有提及更改为新位置
我成了:
datadir=/array2/mysql
socket=/array2/mysql/mysql.sock
更新目录权限:
chown -R mysql:mysql /array2/mysql
重命名旧目录:
mv /var/lib/mysql /var/lib/mysql-old
创建一个符号链接,以防万一:
ln -s /array2/mysql /var/lib/mysql
让AppArmor了解新的datadir:
echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias
重新加载apparmor配置文件
sudo /etc/init.d/apparmor reload
然后启动mysql:
start mysql
次佳解决办法
我发现AppArmor是检查syslog的罪魁祸首,并且能够通过遵循此过程成功更改mysql数据位置。
请注意,在下面编辑的文件中,添加了以+开头的行,并删除了以-开头的行。在向这些文件添加行时,实际上不应该键入/粘贴+符号。
我将mysql目录克隆到新位置:
sudo rsync -av /var/lib/mysql /new_dir
然后我在/etc/mysql/my.cnf中编辑了datadir系列:
sudo vi /etc/mysql/my.cnf
-datadir = /var/lib/mysql
+datadir = /new_dir/mysql
然后我编辑了/etc/apparmor.d/usr.sbin.mysqld:
sudo vi /etc/apparmor.d/usr.sbin.mysqld
- /var/lib/mysql/ r,
- /var/lib/mysql/** rwk,
+ /new_dir/mysql/ r,
+ /new_dir/mysql/** rwk,
然后我重新启动了mysql。
第三种解决办法
意识到。
如果您有InnoDB表,则必须通过ibdata*和ib_logfile*文件进行复制,否则您将无法使用这些表。你会得到:
‘Table ‘databaseName.tableName’ doesn’t exist’
错误。
运行此复制命令以复制ibdata*和ib_logfile*文件。
sudo cp -p /var/lib/mysql/ib* /array2/mysql/
第四种办法
我只是尝试了另一种方式,有些人可能觉得有用:
复制权限完整:
rsync -avzh /var/lib/mysql /path/to/new/place
备份(如果出现问题):
mv /var/lib/mysql /var/lib/_mysql
创建一个新的空目录来代替旧目录:
mkdir /var/lib/mysql
bind将新位置挂载到旧位置:
mount -B /path/to/new/place /var/lib/mysql
希望能帮到某人,因为符号化对我来说不起作用,这是最简单的方法
第五种办法
如果移动datadir,则不仅需要赋予新的datadir权限,还需要确保所有父目录都具有权限。
我将我的datadir移动到硬盘驱动器上,安装在Ubuntu中:
/media/*user*/Data/
我的datadir是数据库。
我必须为每个媒体,用户和数据目录设置771的权限:
sudo chmod 771 *DIR*
如果这不起作用,另一种让mysql工作的方法是将/etc/mysql/my.cnf中的用户更改为root;虽然毫无疑问从安全角度来看这样做有些问题。
参考资料