Answers:
忘记了应用程序防护。
对于感兴趣的任何人,我都执行了以下操作来移动文件夹。
停止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=/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知道新的数据目录:
echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias
重新加载apparmor配置文件
sudo /etc/init.d/apparmor reload
然后启动mysql:
start mysql
/etc/apparmor.d/usr.sbin.mysqld
每一个MySQL的接收的更新时间,你可以添加/array2/mysql/** rwk,
到/etc/apparmor.d/local/usr.sbin.mysqld
代替。Mysql仍然可以访问旧数据目录,但这可能不是问题。
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf
。为什么只使用数据库文件夹?
innodb_use_native_aio=0
在[mysqld]
你的部分my.cnf
文件,因为在Linux上ZFS不支持AIO。dev.mysql.com/doc/refman/5.5/en/...
通过检查syslog
,我发现AppArmor是罪魁祸首,并且mysql
通过执行此过程能够成功更改数据位置。
请注意,在下面编辑的文件中,+
添加了以开头的行,-
并删除了以开头的行。+
在向这些文件添加行时,您实际上不应键入/粘贴符号。
我将mysql
目录克隆到新位置:
sudo rsync -av /var/lib/mysql /new_dir
然后我在中编辑了这一datadir
行/etc/mysql/my.cnf
:
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/
如果移动数据目录,则不仅需要赋予新的数据目录权限,还需要确保所有父目录都具有权限。
我将datadir移到了一个安装在Ubuntu中的硬盘驱动器上,如下所示:
/media/*user*/Data/
而我的datadir是Databases。
我必须将每个媒体,用户和数据目录的权限设置为771 :
sudo chmod 771 *DIR*
如果这不起作用,则使mysql工作的另一种方法是将/etc/mysql/my.cnf中的用户更改为root。尽管从安全的角度来看这样做无疑存在一些问题。
我更喜欢将mount与bind选项一起使用,这样可以避免Apparmor和Mysql配置中的任何进一步更改。
例如:
假设我想将所有内容移入/var/www
。可以说这个目录是我的开发环境,它挂载在另一个分区中
首先,我们需要停止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
我们空的目录中/var/lib/mysql
。bind
这里的选项很神奇,它将填充mysql和apparmor /var/lib/mysql
的内容,/var/www/mysql
就像什么都没有改变一样。
现在我们进行安装:
sudo mount -a
并重启mysql。