如何更改 MySQL 数据库目录?

如何更改 MySQL 数据库目录?

我使用的是带有 cPanel 的 CentOS。在我的服务器上,所有 MySQL 数据库都保存在/var/lib/mysql。现在/var已 100% 满,MySQL 已停止工作。我该如何将数据库移动到新目录,/home/mysql尤其是考虑到此服务器由 cPanel 管理?

答案1

我无法从 cpanel 确认这一点,因为我无权访问,但这是从通过 ssh 和 sudo 连接到 root 的控制台的示例。有理由使用 /etc/fstab 中的绑定条目而不是符号链接,但这对我来说有效。

我的正常程序是停止 mysql,移动目录内容,链接原始内容,然后重新启动 mysqld。

[tomh@workstation001 ~]$ sudo su -
[root@workstation001 ~]# 

[root@workstation001 ~]# service mysqld stop
Stopping mysqld (via systemctl):  
                                                           [  OK  ]

[root@workstation001 ~]# mv /var/lib/mysql/ /opt/

[root@workstation001 ~]# ln -s /opt/mysql /var/lib/


[root@workstation001 ~]# ls -la /var/lib/mysql
lrwxrwxrwx 1 root root 10 Feb 26 23:02 /var/lib/mysql -> /opt/mysql

[root@workstation001 ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]


[root@workstation001 ~]# mysql -uroot 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.18-log MySQL Community Server (GPL)

mysql> show databases;
...
| Database              |
+-----------------------+
| information_schema    |
| mysql                 |
| performance_schema    |
| test   

我刚刚注意到一个类似的问题,这个问题与它的重复很接近,其中提到了在启用 selinux 的情况下执行上述操作的一些问题; http://crashmag.net/change-the-default-mysql-data-directory-with-selinux-enabled

因此如果您有 selinux,则需要执行一些额外的步骤。

答案2

如果您想更改mysql数据目录,您应该编辑 mysql 配置文件并更改datadir值。

datadir = /home/user/data

您的新数据目录必须由 SELinux 拥有mysql并具有适当的 SELinux 安全上下文。

chown -R    mysql:mysql /home/user/data
chcon -R -t mysqld_db_t /home/user/data

然后重新启动mysql服务器:

systemctl restart mysql
# or
/etc/init.d/mysqld restart

答案3

我发现一步一步的指导对我有用。

您必须安装:

yum install policycoreutils-python

指导:

查看mysql的默认数据库位置的SELinux上下文:

~]# ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

这显示了mysqld_db_t数据库文件位置的默认上下文元素。必须手动将此上下文应用于本示例中使用的新数据库位置,才能使其正常运行。

停止 mysqld 守护进程:

~]# systemctl stop mariadb.service

为数据库的新位置创建一个新目录。在此示例中,使用 /mysql/:

~]# mkdir -p /mysql

将数据库文件从旧位置复制到新位置:

~]# cp -R /var/lib/mysql/* /mysql/

更改此位置的所有权以允许 mysql 用户和组访问。这将设置 SELinux 仍将遵守的传统 Unix 权限:

~]# chown -R mysql:mysql /mysql

运行以下命令查看新目录的初始上下文:

~]# ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql

此新建目录的上下文 usr_t 目前不适合 SELinux 作为 MariaDB 数据库文件的位置。更改上下文后,MariaDB 将能够在此区域正常运行。

/etc/my.cnf使用文本编辑器打开主 MariaDB 配置文件并修改datadir选项,使其指向新位置。在此示例中,应输入的值是/mysql

[mysqld]
datadir=/mysql

保存此文件并退出。

启动mysqld。服务应无法启动,并且拒绝消息将记录到文件中/var/log/messages

~]# systemctl start mariadb.service
Job for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.

但是,如果审计守护进程正在运行并且与其一起运行服务setroubleshoot,则拒绝将被记录到/var/log/audit/audit.log文件中:

SELinux is preventing `/usr/libexec/mysqld` "write" access on /mysql. For complete SELinux messages. run `sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71`

拒绝的原因是mysql对于 MariaDB 数据文件,其标签不正确。SELinux 阻止 MariaDB 访问标记为 的内容usr_t。执行以下步骤可解决此问题:

运行以下命令添加上下文映射mysql。请注意,semanageutility默认情况下未安装。如果您的系统上缺少它,请安装该policycoreutils-python包。

~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"

此映射写入文件/etc/selinux/targeted/contexts/files/file_contexts.local

~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local

/mysql(/.*)?    system_u:object_r:mysqld_db_t:s0

现在使用该restorecon实用程序将此上下文映射应用到正在运行的系统:

~]# restorecon -R -v /mysql

现在mysql位置已标记为 MariaDB 的正确上下文,mysqld 启动:

~]# systemctl start mariadb.service

确认上下文已发生变化mysql

~]$ ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

位置已更改并标记,并且mysqld已成功启动。此时应测试所有正在运行的服务以确认正常运行。

答案4

停止默认安装/实例

service mysqld stop

清除当前配置

rm /etc/my.cnf

卸载默认安装/实例

yum remove mysql mysql-server -y

清除当前Datadir

test -d /var/lib/mysql/ && rm -rf /var/lib/mysql/

清除“新”数据目录

test -d /mysql/mysql/ && rm -rf /mysql/mysql/

再次安装

yum install mysql mysql-server -y

检查服务状态

service mysqld status

启动它-仅创建第一个/默认结构

service mysqld start

检查服务状态

service mysqld status

中断当前 MySQL 服务器安装

service mysqld stop

确保不再有实例/服务正在运行

ps axu | grep mysql

将 mysql 数据目录移动到 '/mysql' 分区并创建符号链接

test -d /var/lib/mysql/ && mv /var/lib/mysql/ /mysql/ && ln -s /mysql/mysql /var/lib/

检查符号链接和真实路径

ls -lrth /var/lib/ | grep mysql 

设置新 Datadir 的权限

chown -R mysql:mysql /mysql/mysql

启动它

service mysqld start

尝试连接(请记住,MySQL 的默认安装没有为“root”用户设置“pwd”,因此您应该使用“空白密码”进行连接

mysql -u root -p --host 127.0.0.1

连接到 MySQL 后,创建一个新的数据库,以测试它是否正常工作以及 MySQL 将在哪里创建文件夹/文件结构

create database DBTesteNew;
exit

检查新数据库是否在“new datadir”上

ls /mysql/mysql

确保 mysqld 设置为在启动时启动

chkconfig mysqld on

重新开始

reboot

相关内容