将 mysql 数据目录移动到 TrueCrypt 卷

将 mysql 数据目录移动到 TrueCrypt 卷

我有 Ubuntu Desktop 11.04,并且我试图将 /var/lib/mysql 移动到 TrueCrypt 卷,但每次尝试都失败。

这是出于开发目的,并且我需要使用一个特定的数据库,由于多种原因,该数据库需要高度安全。

在全新安装 mysql-server 和 mysql-client 后,我​​可以毫无问题地启动 mysql。因此,我将 /var/lib/mysql 移动到 TrueCrypt 卷(称为 /foo/truecrypt),然后编辑 /etc/mysql/my.cnf 以将 datadir 指向 /foo/truecrypt。

检查权限以确保它们相同后,我尝试再次启动 mysql。

它不起作用(MySQL 只是继续挂起),我无法让 MySQL 再次工作(即使终止所有 mysql 进程并将数据目录移回 /var/lib/mysql)。今晚我至少执行了 apt-get --purge remove mysql-client mysql-server mysql-common 5 次(然后删除了 /var/lib/mysql、etc/mysql/ 和 /var/log/mysql* 中的所有文件),以便重新安装并重试。

当 MySQL 挂起时,我进入了 /var/log/mysql/,以下是 mysql.err 中显示的内容:

120421 22:50:03 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
120421 22:50:03 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
120421 22:50:03  InnoDB: Initializing buffer pool, size = 8.0M
120421 22:50:03  InnoDB: Completed initialization of buffer pool
120421 22:50:03  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

我尝试过移动 /var/lib/mysql/,然后创建符号链接,而不是编辑 my.cnf。这没什么区别。上面的错误表示缺少文件或权限问题。但是,plugin.frm 存在于 /foo/truectrypt/mysql/mysql 中(因为我只是移动了父目录),并且该目录中所有其他文件的所有权和权限与原先相同。

你有什么建议吗?我不知所措。

答案1

我从未尝试过完全按照你的做法去做,但我已经设置了无论我启动到哪个操作系统都可以访问的 mysql 数据库。我通过移动/var/lib/mysql/database到共享分区/shared/database然后将目录符号链接回 来实现这/var/lib/mysql/database一点。如果该过程对你不起作用,那么我会研究符号链接是否适用于 TrueCrypt(应该可以)。

错误 ( ) 中提到的文件ibdata1存在于,/var/lib/mysql因此我只能想象您将一个目录移动到了树上的多个目录。不要移动/var/lib/mysql,而是移动数据库的特定目录/var/lib/mysql/database

答案2

问题出在 AppArmor 上,我从未使用过它。我(最终)找到了一个不起眼的网站,上面说了以下内容:

Ubuntu 使用一种名为 AppArmor 的安全软件,该软件指定了文件系统应用程序可以访问的区域。除非您修改 MySQL 的 AppArmor 配置文件,否则您将永远无法使用新的 datadir 位置重新启动 MySQL。

(从http://article.my-addr.com/?show=linux_ubuntu_change_datadir-move_mysql_database_to_other_path

我需要编辑 /etc/apparmor.d/usr.sbin.mysqld 如下:

按照说明“复制以 /var/lib/mysql 开头的行并用 /usr/new_datadir 替换重复的字符串”后,将 /usr/new_datadir 符号链接到 /var/lib/mysql,它就可以正常工作了!

相关内容