Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MySQL InnoDB数据库移动到单独的驱动器_Mysql_Innodb_Symlink - Fatal编程技术网

将MySQL InnoDB数据库移动到单独的驱动器

将MySQL InnoDB数据库移动到单独的驱动器,mysql,innodb,symlink,Mysql,Innodb,Symlink,在我的MySQL安装中,我有一个InnoDB数据库,我知道它会变得非常大,所以我决定将它移动到自己的磁盘上。我希望通过将文件移动到另一个磁盘,然后创建一个符号链接来实现这一点,但我遇到了错误 这就是我所做的: 1) 在我的.cnf中,我设置了 [mysqld] innodb_文件_每_表 (这是可行的,我在数据库文件夹中有一个.ibd per.frm。) 2) 我已经检查了符号链接是否可以使用显示变量,如“have_symlink” (我知道文件上说: 仅在以下情况下完全支持符号链接: MyIS

在我的MySQL安装中,我有一个InnoDB数据库,我知道它会变得非常大,所以我决定将它移动到自己的磁盘上。我希望通过将文件移动到另一个磁盘,然后创建一个符号链接来实现这一点,但我遇到了错误

这就是我所做的:

1) 在我的.cnf中,我设置了

[mysqld] innodb_文件_每_表

(这是可行的,我在数据库文件夹中有一个.ibd per.frm。)

2) 我已经检查了符号链接是否可以使用
显示变量,如“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/