Nor*_*ing 12 mysql symlink innodb
在我的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
Run Code Online (Sandbox Code Playgroud)
符号链接(如预期的那样) lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/
数据库文件夹权限 drwx------ mysql mysql
所有文件权限都是 -rw-rw---- mysql mysql
我正在使用Ubuntu 10.04 Server和MySQL 5.1.41(默认来自apt).
有没有人成功完成这项工作?
Nor*_*ing 17
事实证明这是有效的,但是我的旧敌人appArmor阻止MySQL阅读移动的目录.
sudo nano /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
添加行:
/new-db-path/ r,
/new-db-path/** rwk,
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
nev*_*ves 13
Norling Jr.用AppArmor提示节省了我的一天,但由于我在配置它时遇到了一些麻烦,我正在写一个更详细的答案.我正在使用Ubuntu 12.04.
开始成为root以节省输入所有sudos的需要:
sudo su -
Run Code Online (Sandbox Code Playgroud)
在MySQL文档之后,首先将已创建的数据库目录移动到另一个路径:
mv /var/lib/mysql/yourdatabase /new/path/
Run Code Online (Sandbox Code Playgroud)
这是我的第一个陷阱.检查mysql用户是否可以访问此新路径:
sudo -u mysql ls /new/path/yourdatabase
Run Code Online (Sandbox Code Playgroud)
如果您拒绝访问,则应该为每个父目录授予执行权限:
chmod a+x /new /new/path/
Run Code Online (Sandbox Code Playgroud)
测试再次访问该文件.如果它仍然无效,请尝试在Stack Overflow中提问:-)
链接新的dir位置并为其提供正确的权限:
ln -s /new/path/yourdatabase /var/lib/mysql/
chown mysql:mysql /var/lib/mysql/yourdatabase
Run Code Online (Sandbox Code Playgroud)
让我们编辑AppArmor本地配置文件.你不应该改变/etc/apparmor.d/usr.sbin.mysqld文件.编辑本地conf,以便在系统更新后不会丢失它:
emacs /etc/apparmor.d/local/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
添加Norling Jr.配置:
/new/path/yourdatabase/ r,
/new/path/yourdatabase/** rwk,
Run Code Online (Sandbox Code Playgroud)
不要错过最后一个逗号.保存文件并重新加载AppArmor配置:
apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
这不仅会重新加载AppArmor MySql配置,还会测试它是否存在任何语法错误(非常重要).如果您不运行解析器,则不会应用新的conf.
最后只需打开mysql客户端并输入SHOW DATABASES.如果您的数据库出现,一切都很好.输入"USE yourdatabase"进行其他检查.
更强大的测试也会重新加载mysql服务:'service mysql restart'并尝试访问您的数据库.
现在我会记得下次我需要这样做.谷歌和SO一起是世界上最好的笔记本电脑:-)
我不确定您的解决方案是最好的主意。请参阅我的帖子:
这里还有另一个线程: