在我的MySQL安装中,我有一个InnoDB数据库,我知道它会变得非常大,所以我决定将它移动到自己的磁盘上。我希望通过将文件移动到另一个磁盘然后创建一个符号链接来实现这一点,但我遇到了错误!
这就是我所做的:
1)在my.cnf中我设置了
的[mysqld] innodb_file_per_table
(这有效,我在数据库文件夹中每个.frd有一个.ibd。)
2)我已检查符号链接是否可以SHOW VARIABLES LIKE "have_symlink";
(我知道文档说:
完全支持符号链接 MyISAM表。对于使用的文件 其他存储引擎的表,你 如果你试图可能会遇到奇怪的问题 使用符号链接。
但我需要外键......)
3)我移动了数据库文件夹并创建了一个符号链接。
4)重新启动mysql并尝试:
mysql> USE db_name
Database changed
mysql> SHOW TABLES;
ERROR 1018 (HY000): Can't read dir of './db_name/' (errno: 13)
mysql> exit
user@comp# perror 13
OS error code 13: Permission denied
符号链接(正如预期的那样)lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/
数据库文件夹权限为drwx------ mysql mysql
所有文件权限均为-rw-rw---- mysql mysql
我正在使用带有MySQL 5.1.41的Ubuntu 10.04服务器(默认来自apt)。
你们有没有成功地完成这项工作?
答案 0 :(得分:17)
原来这个有效,但是我的老敌人appArmor阻止了MySQL读取移动的目录。
sudo nano /etc/apparmor.d/usr.sbin.mysqld
添加行:
/new-db-path/ r,
/new-db-path/** rwk,
感谢您的帮助!
答案 1 :(得分:12)
Norling Jr.用AppArmor提示节省了我的一天,但由于我在配置它时遇到了一些麻烦,我正在写一个更详细的答案。我正在使用Ubuntu 12.04。
开始成为root以节省输入所有sudos的需要:
sudo su -
关注MySQL docs,您首先将已创建的数据库目录移动到另一条路径:
mv /var/lib/mysql/yourdatabase /new/path/
这是我的第一个陷阱。检查mysql用户是否可以访问这个新路径:
sudo -u mysql ls /new/path/yourdatabase
如果您拒绝访问,则应该为每个父目录提供执行权限:
chmod a+x /new /new/path/
测试再次访问该文件。如果它仍然无效,请尝试在Stack Overflow中提问: - )
链接新目录位置并为其提供正确的权限:
ln -s /new/path/yourdatabase /var/lib/mysql/
chown mysql:mysql /var/lib/mysql/yourdatabase
让我们编辑AppArmor本地配置文件。你不应该改变/etc/apparmor.d/usr.sbin.mysqld文件。编辑本地conf,以便在系统更新后不会丢失它:
emacs /etc/apparmor.d/local/usr.sbin.mysqld
添加Norling Jr.配置:
/new/path/yourdatabase/ r,
/new/path/yourdatabase/** rwk,
不要错过最后一个逗号。保存文件并重新加载AppArmor配置:
apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
这不仅会重新加载AppArmor MySql配置,还会在没有语法错误的情况下对其进行测试(非常重要)。如果您不运行解析器,则不会应用新的conf。
最后只需打开mysql客户端并输入SHOW DATABASES
。如果您的数据库出现,一切都很好。输入“USE yourdatabase”进行其他检查。
更强大的测试还会重新加载mysql服务:'service mysql restart'并尝试访问您的数据库。
现在我会记得下次我需要这样做。谷歌和SO一起是世界上最好的笔记本电脑: - )
答案 2 :(得分:3)
我不确定你的解决方案是最好的主意。在这里看我的帖子:
这里还有另一个主题:
答案 3 :(得分:1)
应该可以使用具有适当权限的本地安装(绑定)并挂载oprions(包括selinux或apparmor上下文):
/dev/sdc on /var/lib/mysql/my-db/
/dev/sdd on /var/lib/mysql/her-db/
fs.example.com:/path/to/wherever on /var/lib/mysql/my-other-db/
虽然我尚未测试此解决方案,因此请自行承担风险。