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

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一起是世界上最好的笔记本电脑:-)

  • 这非常有帮助,谢谢! (3认同)

Mor*_*ker 3

我不确定您的解决方案是最好的主意。请参阅我的帖子:

http://www.mysqlperformanceblog.com/2010/12/25/spreading-ibd-files-across-multiple-disks-the-optimization-that-isnt/

这里还有另一个线程:

因诺数据库;多个数据目录