如何移动MySQL数据目录?
我试图将我的MySQL数据库的数据目录移动到我作为挂载点/array2/
的第二个磁盘arrays。
我遇到的问题是我已经尝试了一切,在我修改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
然后我编辑了datadir
中的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*
文件,否则你将无法使用这些表。 你会得到:
‘表’databaseName.tableName’不存在’
错误。
运行此复制命令以复制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; 虽然毫无疑问从安全角度来看这样做有些问题。
我更喜欢使用mount with bind选项,所以我避免在Apparmor和Mysql配置中进行任何进一步的更改。
例如:
假设我想在/var/www
移动所有内容。 让我们说这个dir是我的开发环境,它安装在不同的分区中
-
首先我们需要停止mysql :
sudo systemctl stop mysql.service
-
我们移动文件 (保留权限)
sudo rsync -av /var/lib/mysql /var/www
这将生成包含所有内容的目录
/var/www/mysql/
。 -
我们删除旧目录中的所有内容:
sudo rm -r /var/lib/mysql/*
-
我们在旧目录中使用
bind
选项挂载新目录。
编辑/etc/fstab
并添加以下行:/var/www/mysql /var/lib/mysql none bind 0 0
这将把
/var/www/mysql
挂载到我们的空dir/var/lib/mysql
这里的bind
选项很神奇,它将使用/var/www/mysql
的内容填充/var/lib/mysql
,因此对于mysql和apparmor,它就像没有任何改变。 -
现在我们做mount:
sudo mount -a
并重启mysql。
你会意识到,如果你从接受的答案中逐字逐句地遵循这些命令,它将会失败吗?
cp -R / var / lib / mysql / array2 / mysql
将/ var / lib / mysql复制到/ array2 / mysql / mysql。
设置配置文件时,最好将/ array2 / mysql / mysql作为目录放入,否则mysqld将无法启动。
更好的复制命令是:
cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql
只需2美分。