【问题标题】:MariaDB failed to start after change of datadir更改 datadir 后 MariaDB 无法启动
【发布时间】:2017-12-10 15:29:41
【问题描述】:

背景信息:

我让 CentOS 7 安装程序自动分区。

Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   43G  7.9G  85% /
devtmpfs                  32G     0   32G   0% /dev
tmpfs                     32G     0   32G   0% /dev/shm
tmpfs                     32G  9.3M   32G   1% /run
tmpfs                     32G     0   32G   0% /sys/fs/cgroup
/dev/sda1                492M  123M  369M  25% /boot
/dev/mapper/centos-home  476G   54G  422G  12% /home
tmpfs                    6.3G     0  6.3G   0% /run/user/1000
tmpfs                    6.3G     0  6.3G   0% /run/user/0

但没想到大部分磁盘空间都到了/root目录下, 并且 MariaDB 现在 35GB 在 /var/lib/mysql 中的空间很快就会用完。

所以我通过下面的命令更改了数据目录,但随后无法启动

systemctl stop mariadb
cp -fR /var/lib/mysql /home/
chown -R mysql:mysql /home/mysql

vi /etc/my.cnf.d/server.cnf 并添加以下行

[mysqld] 
datadir=/home/mysql

systemctl 启动 mariadb

但它失败并且符合“无法创建测试文件”

Jul 06 22:32:26 ging2 systemd[1]: Starting MariaDB database server...
Jul 06 22:32:26 ging2 mysqld[9450]: 2017-07-06 22:32:26 140114825693312 [Note] options --log-slow-admin-statements, --log-queries-not-us...s not set
Jul 06 22:32:26 ging2 mysqld[9450]: 2017-07-06 22:32:26 140114825693312 [Note] /usr/sbin/mysqld (mysqld 10.2.5-MariaDB) starting as process 9450 ...
Jul 06 22:32:26 ging2 mysqld[9450]: 2017-07-06 22:32:26 140114825693312 [Warning] Can't create test file /home/mysql/ging2.lower-test
Jul 06 22:32:26 ging2 mysqld[9450]: [87B blob data]
Jul 06 22:32:26 ging2 mysqld[9450]: 2017-07-06 22:32:26 140114825693312 [ERROR] Aborting

我不知道为什么它不起作用,我认为权限和所有权与旧的 datadir 相同。

我想你们中的一些人知道为什么。那么有人可以帮忙吗?

谢谢!!

【问题讨论】:

  • 对于初学者,请尝试禁用强制执行 SELinux,看看是否有帮助。
  • 我试过了,没用
  • 我可以在 /var/lib/ 中创建或初始化新数据库,但不能在 /home/xxxx 中创建或初始化数据库

标签: mysql mariadb


【解决方案1】:

这只是在 Debian 8 -> 9 升级时遇到的。无论我尝试什么,我都无法在 /home 下为我的数据目录启动 MariaDB。

我能找到的所有答案都提到了更改 AppArmor 或 SELinux,但都没有安装。

问题实际上是 systemd ,它在 MariaDB 启动文件中有一个安全指令阻止它使用 /home!

systemd 服务文件(Debian 上的 /lib/systemd/system/mariadb.service)包含设置:ProtectHome=true。此设置将阻止 MySQL 写入 /home 下的任何文件夹,因此它会在启动时抛出 ErrNo 13: Permission Denied 错误。

解决方法是将 datadir 移出 /home,或者关闭 systemd 服务文件中的此安全功能:

我将其修复如下:

1: sudo cp /lib/systemd/system/mariadb.service /etc/systemd/system/ # 本地覆盖服务文件

2:编辑 /etc/systemd/system/mariadb.service 并将 ProtectHome 更改为 false (ProtectHome=false)。保存文件

3: sudo systemctl daemon-reload # 刷新 systemd 服务,让它看到你的覆盖文件

4: sudo systemctl start mysql

...它应该终于开始了!!!

如果安装了 AppArmor 和 SELinux,您还需要处理它们,两者都会阻止对 MySQL 数据目录的更改。

【讨论】:

    【解决方案2】:

    ِ您试图将MySQLdatadir 更改为位于/home 下的目录,通常MySQL 不接受。首先您需要更改 MySQL 的默认配置,然后为新的 datadir 目录及其父目录授予一些系统权限,最后调整 SELinux 上下文。

    虽然你已经正确通过了很多步骤,但我还是想演示一下完整的步骤:

    禁用 SELinux

    首先,让我提一下 基于 RedHat 的 Linux 发行版 (RHEL),例如 FedoraCentOS等。使用强制访问控制策略的 SELinux。所以最好在下面的步骤中disable它,然后通过一些调整来启用它。

    打开 SELinux 配置文件

    nano /etc/selinux/config
    

    找到包含SELINUX=enforcing 的行并将其值更改为SELINUX=disabled保存文件并重新启动您的系统。

    更改 MySQL 的数据目录

    停止 MySQL 服务

    systemctl stop mysqld.service
    

    为 MySQl 的数据目录创建一个新目录。由于某些原因超出了本解决方案的范围,强烈建议不要在/home 目录下创建数据目录,但可能像我这样的一些人更喜欢它(它需要更多的步骤)。

    mkdir /home/mysql
    

    新目录所有权权限设置为默认MySQL的数据目录(/var/lib/mysql):

    chown --reference=/var/lib/mysql   /home/mysql
    chmod --reference=/var/lib/mysql   /home/mysql
    

    将所有文件从默认目录复制到新目录

    cp -rp /var/lib/mysql/*   /home/mysql
    

    编辑/etc/my.cnf 文件,在[mysqld] 部分下添加以下行:

    [mysqld]
    datadir=/home/mysql
    

    解决/home 问题

    确保新datadir以上的所有父目录对所有(用户都有x执行)权限em>、 和其他)。我宁愿不使用递归脚本,所以:

    chmod +x /home/mysql
    chmod +x /home
    

    正如前面提到的,在/home 目录下创建 datadir 很棘手,因为默认情况下 MySQL 不允许这样做。在 /etc/systemd/system/mariadb.service.d 下创建一个文件,并将以下几行放入:

    #open an editor to create a file
    nano /etc/systemd/system/mariadb.service.d/centreon.conf 
    

    将以下行复制到新的centreon.conf 文件并保存

    [Service]
    ProtectHome=false 
    #ProtectSystem=off
    

    通过运行以下命令应用更改

    systemctl daemon-reload
    

    现在您可以运行 MySQL 服务了:

    systemctl start mysqld.service
    

    启用 SELinux

    再次编辑/etc/selinux/config 文件,并将SELINUX=disabled 的行更改为SELINUX=enforcing。保存文件并重新启动系统。

    要查询 SELinux 的当前状态,请使用以下命令,它应该打印 enforcing 作为输出。

    getenforce
    

    SELinux context 使用mysqld_db_t,如果设置不正确,mysqld 进程将被中止,因此您需要对其进行更新:

    semanage fcontext -a -t mysqld_db_t "/home/mysql(/.*)?"
    
    restorecon -Rv /home/mysql
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2017-05-16
      • 2018-08-30
      • 1970-01-01
      • 2012-09-28
      相关资源
      最近更新 更多