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

发布于 2024-10-02 20:36:05 字数 1029 浏览 0 评论 0原文

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

这就是我所做的:

1)在 my.cnf 中我设置了

[mysqld] innodb_file_per_table

(这有效,我在数据库文件夹中每个 .frm 有一个 .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 code>

我正在使用 Ubuntu 10.04 服务器和 MySQL 5.1.41(默认来自 apt)。

你们有人成功地做到了这一点吗?

In my MySQL installation I have one InnoDB database that I know will grow very large so I have decided to move it to its own disk. I was hoping to do this by moving the files to the other disk and then create a symlink but I run into errors!

This is what I have done:

1) In my.cnf I have set

[mysqld]
innodb_file_per_table

(This works, I have one .ibd per .frm in the database folder.)

2)I have checked if symlinks are ok with SHOW VARIABLES LIKE "have_symlink";

(I know that the documentation says:

Symlinks are fully supported only for
MyISAM tables. For files used by
tables for other storage engines, you
may get strange problems if you try to
use symbolic links.

But I need foreign keys...)

3) I moved the database folder and created a symlink.

4) Restarted mysql and tried:

 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

symlink is (as expected) lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/

database folder permissions are drwx------ mysql mysql

all file permissions are -rw-rw---- mysql mysql

I am using Ubuntu 10.04 Server with MySQL 5.1.41 (default from apt).

Have any of you done this successfully?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

叫思念不要吵 2024-10-09 20:36:05

事实证明这可行,但我的老敌人 appArmor 阻止了 MySQL 读取移动的目录。

sudo nano /etc/apparmor.d/usr.sbin.mysqld

添加行:

/new-db-path/ r,
/new-db-path/** rwk,

感谢您的帮助!

Turns out this works but my old enemy appArmor blocked MySQL from reading the moved directory.

sudo nano /etc/apparmor.d/usr.sbin.mysqld

add lines:

/new-db-path/ r,
/new-db-path/** rwk,

Thanks for helping out!

旧人哭 2024-10-09 20:36:05

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 文件。编辑本地配置,这样系统更新后就不会丢失它:

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”并尝试访问您的数据库。

现在我会记住下次我需要这样做的时候。 Google 和 SO 一起是世界上最好的笔记本:-)

Norling Jr. saved my day with the AppArmor tip, but since I had some trouble configuring it, I'm writing a more detailed answer. I'm using Ubuntu 12.04.

Start becoming root to save the need to type all that sudos:

sudo su -

Following MySQL docs, you first move your already created database dir to another path:

mv /var/lib/mysql/yourdatabase /new/path/

Here was my first trap. Check if the mysql user has access to this new path:

sudo -u mysql ls /new/path/yourdatabase

If you got access denied, you should probably give execute permission to every parent dir:

chmod a+x  /new  /new/path/

Test to access the file again. If it still doesn't work, try asking a question in Stack Overflow:-)

Link the new dir location and give it the correct permissions:

 ln -s /new/path/yourdatabase /var/lib/mysql/
 chown mysql:mysql /var/lib/mysql/yourdatabase

Let's edit AppArmor local configuration file. You shoudn't change /etc/apparmor.d/usr.sbin.mysqld file. Edit the local conf so you won't loose it after system updates:

emacs /etc/apparmor.d/local/usr.sbin.mysqld

add Norling Jr. configurations:

/new/path/yourdatabase/ r,
/new/path/yourdatabase/** rwk,

Don't miss the last comma. Save the file and reload AppArmor configuration:

apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

This will not just reload AppArmor MySql configuration, but also test it if there isn't any syntax error (a very important thing). If you don't run the parser, the new conf won't be applied.

Finally just open mysql client and type SHOW DATABASES. If your database appears, everything is probably fine. Type 'USE yourdatabase' for another check.

A more robust test would also reload the mysql service: 'service mysql restart' and try to access your database.

Now I'll remember next time I need to do it. Google and SO together are the best notebook in the world :-)

飘逸的'云 2024-10-09 20:36:05

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

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

还有这个其他线程这里:

Innodb;多个数据目录

吃兔兔 2024-10-09 20:36:05

应该可以使用具有适当权限和挂载选项(包括 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/

虽然我还没有测试过此解决方案,所以使用时需要您自担风险。

It should be possible to use local mounts (bindings) with appropriate permissions and mount oprions (including the selinux or apparmor contexts):

/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/

Though I haven't tested this solution so use at your own risk.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文