如何更改MySQL数据库目录?

我正在用cPanel使用CentOS。 在我的服务器上,所有的MySQL数据库保存在/var/lib/mysql 。 现在/var已经100%满了,MySQL已经停止工作了。 如何将数据库移动到像/home/mysql这样的新目录,特别是考虑到这个服务器是用cPanelpipe理的?

我不能证实这从cpanel,因为我没有访问,但这是从控制台通过SSH和sudo连接到根的例子。 有在/ 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还有一些额外的步骤。

如果你想改变mysql数据目录,你应该编辑mysqlconfiguration文件并改变datadir值。

 datadir = /home/user/data 

你的新数据目录必须mysql拥有,并有适当的安全上下文。

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

重启mysql服务器

 /etc/init.d/mysqld restart 

我发现这个一步一步的指导为我工作。

您必须安装:

 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 

为数据库的新位置创build一个新目录。 在这个例子中,使用/ 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 

这个新创build的目录的上下文usr_t目前不适合SELinux作为MariaDB数据库文件的位置。 一旦上下文发生变化,MariaDB将能够在这个区域正常工作。

用文本编辑器打开主要的MariaDBconfiguration文件/etc/my.cnf ,并修改datadir选项,以便引用新的位置。 在这个例子中,应该input的值是/mysql

 [mysqld] datadir=/mysql 

保存此文件并退出。

启动mysqld 。 该服务将无法启动,并且拒绝消息将被logging到/var/log/messages文件中:

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

但是,如果审计守护进程正在运行,并且使用setroubleshoot服务,则拒绝将被logging到/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没有默认安装。 如果在系统上缺less,请安装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已成功启动。 此时所有正在运行的服务都应进行testing以确认正常运行。

停止默认安装/实例

 service mysqld stop 

清除当前configuration

 rm /etc/my.cnf 

卸载默认安装/实例

 yum remove mysql mysql-server -y 

清除当前数据

 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 

启动它 – 只是为了创build第一个/默认结构

 service mysqld start 

检查服务状态

 service mysqld status 

中断当前的MySQL服务器安装

 service mysqld stop 

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

 ps axu | grep mysql 

将mysql数据目录移到“/ mysql”分区并创build符号链接

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

检查符号链接和真实path

 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,创build一个新的数据库只是为了testing它是否工作,MySQL将创build文件夹/文件结构

 create database DBTesteNew; exit 

检查新的数据库是否在'新数据目录'

 ls /mysql/mysql 

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

 chkconfig mysqld on 

重新开始

 reboot