将MySQL InnoDB数据库移动到单独的驱动器
在我的MySQL安装中,我有一个InnoDB数据库,我知道它会变得非常大,所以我决定将它移动到自己的磁盘上。我希望通过将文件移动到另一个磁盘,然后创建一个符号链接来实现这一点,但我遇到了错误 这就是我所做的: 1) 在我的.cnf中,我设置了 [mysqld] innodb_文件_每_表 (这是可行的,我在数据库文件夹中有一个.ibd per.frm。) 2) 我已经检查了符号链接是否可以使用将MySQL InnoDB数据库移动到单独的驱动器,mysql,innodb,symlink,Mysql,Innodb,Symlink,在我的MySQL安装中,我有一个InnoDB数据库,我知道它会变得非常大,所以我决定将它移动到自己的磁盘上。我希望通过将文件移动到另一个磁盘,然后创建一个符号链接来实现这一点,但我遇到了错误 这就是我所做的: 1) 在我的.cnf中,我设置了 [mysqld] innodb_文件_每_表 (这是可行的,我在数据库文件夹中有一个.ibd per.frm。) 2) 我已经检查了符号链接是否可以使用显示变量,如“have_symlink” (我知道文件上说: 仅在以下情况下完全支持符号链接: MyIS
显示变量,如“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
符号链接是(如预期的)lrwxrwx mysql db\u name->/path to/db\u name/
数据库文件夹权限为drwx------mysql
所有文件权限都是-rw-rw----mysql
我正在使用Ubuntu10.04服务器和MySQL 5.1.41(apt的默认设置)
你们中有人成功地做到了吗?结果证明这是可行的,但我的老敌人appArmor阻止MySQL读取移动的目录
sudo nano /etc/apparmor.d/usr.sbin.mysqld
添加行:
/new-db-path/ r,
/new-db-path/** rwk,
谢谢你的帮助 我不确定你的解决方案是不是最好的主意。请看我的帖子:
这里还有另一个线程:
小诺林用AppArmor技巧拯救了我的一天,但由于我在配置它时遇到了一些麻烦,我正在写一个更详细的答案。我正在使用Ubuntu 12.04
开始成为root用户以保存键入所有sudo的需要:
sudo su -
接下来,首先将已创建的数据库目录移动到另一个路径:
mv /var/lib/mysql/yourdatabase /new/path/
这是我的第一个陷阱。检查mysql用户是否有权访问此新路径:
sudo -u mysql ls /new/path/yourdatabase
如果访问被拒绝,您可能应该为每个父目录授予执行权限:
chmod a+x /new /new/path/
测试以再次访问该文件。如果仍然不起作用,请尝试在堆栈溢出中提问:-)
链接新目录位置并为其提供正确的权限:
ln -s /new/path/yourdatabase /var/lib/mysql/
chown mysql:mysql /var/lib/mysql/yourdatabase
让我们编辑AppArmor本地配置文件。您不应该更改/etc/apparmor.d/usr.sbin.mysqld文件。编辑本地配置,以便在系统更新后不会丢失它:
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
。如果您的数据库出现,则一切都可能正常。键入“使用您的数据库”进行另一项检查
更健壮的测试还将重新加载mysql服务:“Servicemysql restart”并尝试访问您的数据库
现在我会记得下次我需要做的时候。Google和SO一起是世界上最好的笔记本电脑:-)应该可以使用具有适当权限和装载操作(包括selinux或apparmor上下文)的本地装载(绑定):
虽然我还没有测试过这个解决方案,所以使用这个解决方案的风险自负。最简单的方法是使用mysqldump,然后删除schema change config并导入它,如果你的数据库不是很大的话。我想把剩下的数据库保留在系统磁盘上(对于drupal之类的东西),只把这个特定的数据库移出数据目录。很抱歉,如果问题不清楚的话。这可能更适合-投票迁移它…@Norling Jr:为什么不创建另一个数据库,并将该数据库目录装载到您想要的磁盘上?@ajreal:这是什么意思?使用单独的MySQL实例并将其数据目录设置为新磁盘?不会很整洁的。。。使用单个MySQL实例,创建的所有数据库都是相对于数据目录创建的。我正在尝试移动其中一个…在移动数据库并用符号链接替换它之后,Ubuntu 12.04上出现了同样的问题。按照您的建议编辑AppArmor配置文件是可行的。谢谢谢谢这也是我的解决方案。谢谢!在Ubuntu 12.10上更改后,不要忘记重新启动apparmor服务。我必须重新启动apparmor和mysql服务才能使新策略生效。这非常有用,谢谢!我可以证实这是有效的。您必须将整个分区专用于mysql子目录,但一旦您这样做并正确地装载它,它就会工作得很好。
/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/