![如何更改 MySQL 数据库目录?](https://linux22.com/image/576878/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%20MySQL%20%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我使用的是带有 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