≡菜单

如何在CentOS和Ubuntu上将MySQL数据目录移动到新位置

默认情况下,MySQL数据库将在/ var / lib / mysql目录下创建。

如果您正在运行一个占用很少空间的小型数据库,则可以这样做。但是在生产中,对于更大的数据库,根分区下可能没有足够的空间。

在这种情况下,您可能需要将MySQL数据库从根分区移动到其他分区。

要高层更改MySQL目录,您必须执行以下三个步骤:

  1. 将MySQL数据库文件从/ var / lib / mysql移到另一个分区
  2. 用新的目录位置修改my.cnf文件
  3. 更新安全性设置以反映目录更改:在CentOS或RedHat上,修改SELinux设置。在Ubuntu或Debian上,修改AppArmor设置。

本教程详细说明了如何执行上述三个步骤将MySQL数据移动到其他目录。

备份当前的MySQL

在执行任何操作之前,请停止MySQL数据库并对数据库进行冷备份。

默认情况下,MySQL将数据库放在/ var / lib / mysql目录下。将该mysql目录复制到其他位置进行备份。

service mysqld stop

cp -r /var/lib/mysql /backup/mysql

或者,如果您愿意,可以使用 mysqldump进行MySQL数据库备份.

将MySQL数据目录移动到其他分区

在此示例中,我的根分区是/ dev / sda1,’默认的/ var / lib / mysql目录有很多空间。但是,我在/ dev / sdb1磁盘上有/ data分区,它具有很大的空间。

因此,我将把MySQL数据库从/分区移动到/ data分区。

创建以下目录,并将mysql数据从/ var / lib移动到/ data / var / lib,如下所示。

mkdir -p /data/var/lib

cd /var/lib

mv mysql /data/var/lib/

需要考虑的几点:

  • 您也可以将mysql目录移动到/ data / var / lib /目录,并从/ var / lib创建指向/ data / var / lib的符号链接。但是,在这种特定情况下,我更喜欢上面简单地移动不带符号链接的目录以避免混淆。
  • 如果可能,请尝试使用move命令将目录移至上方(而不是复制目录)。当执行复制时,SELinux上下文将丢失,您必须稍后手动进行设置(如下所述)。但是,当您移动时,适用于MySQL的SELinux上下文将保持不变,您不必担心对其进行更改。

另外,如果您已复制目录(而不是移动目录),请确保适当地更改了所有权。如果没有,您可能会收到以下错误消息:MySQL error:1017Can’t查找文件:(errno:13)

chown -R mysql:mysql /data

修改my.cnf并启动MySQL

在/etc/my.cnf文件中,您需要修改datadir和socket参数,并将它们指向新目录,如下所示。

# vi /etc/my.cnf
datadir=/data/var/lib/mysql
socket=/data/var/lib/mysql/mysql.sock

最后,重新启动MySQL数据库。

# service mysqld start
Starting mysqld:  [  OK  ]

如果您的my.cnf文件中已经定义了tmpdir参数,请同时更改该参数的目录:

tmpdir=/data/var/lib/mysql

更改my.cnf文件中的数据目录和套接字后,如果MySQL无法启动或失败,并显示权限被拒绝的错误消息,则需要按照以下各节中的说明设置SELinux(或AppArmor)。

MySQL的SELinux上下文类型

使用ls -Z命令查看SELinux上下文。在移动目录之前,以下是我的MySQL数据库上的SELinux上下文。在此示例中,“ thegeekstuff”是/ var / lib / mysql目录下的MySQL数据库。

如您所见,mysqld_db_t是SELinux上下文类型。

# ls -Z /var/lib/mysql
drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 thegeekstuff
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0
..

将目录移动到新位置后,您应将准确的SELinux视为移动前的目录。

ls -Z /data/var/lib/mysql

注意:如果您复制了目录(而不是移动目录),则会发现目录已更改。在这种情况下,如下所述更改SELinux上下文。

当SELinux上下文错误时,您会在审核日志(或/ var / log / messages)中看到以下错误消息(或类似内容)

# cat /var/log/audit/audit.log:
type=AVC msg=audit(1447281394.928:20831): avc:  denied  { read } for  pid=21346 comm="mysqld" name="mysql" dev=sda1 ino=5506027 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 

另外,当MySQL DB无法启动时,您还将在mysqld.log文件中看到以下内容。

# cat /var/log/mysqld.log:
mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
[Warning] Can't create test file /var/lib/mysql/devdb..lower-test
/usr/libexec/mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13)
[ERROR] Aborting
[Note] /usr/libexec/mysqld: Shutdown complete

SELinux在CentOS / RedHat上针对MySQL的设置(选项1)

使用chcon命令,您可以在新目录中更改SELinux上下文类型,如下所示。

chcon -R -t mysqld_db_t /data

在上面的命令中:

  • chcon是更改SELinux上下文的命令
  • -R选项将递归地更改给定目录和所有子目录的上下文。
  • -t选项用于指定应设置的SELinux上下文类型。在此示例中,我们将其设置为mysqld_db_t类型。
  • / data是将在其上执行此命令的目录。

注意:从顶级目录/ data(而不是mysql目录)开始更改上下文,该目录将包括mysql目录以及所有子目录和文件。

SELinux在CentOS / RedHat上针对MySQL的设置(选项2)

使用restorecon命令,可以将SELinux上下文还原为正确的类型。但是,在这种情况下,应通过将mysqld_db_t类型添加到SELinux上下文映射中来告知SELinux正确的上下文是什么。

要将SELinux类型添加到上下文映射,请使用semanage命令。安装包含semanage命令的policycoreutils-python软件包。

yum -y install policycoreutils-python

接下来,执行以下命令以在新目录上设置SELinux上下文映射。

semanage fcontext -a -t mysqld_db_t "/data(/.*)?"

在上面的命令中,我们将mysqld_db_t添加到/ data目录下所有子目录和文件的上下文映射中。

最后,使用restorecon命令,该命令会将相应的SELinux上下文还原到新的/ data目录。

restorecon -Rv /data 

确认移动的新/ data目录和mysql子文件夹具有正确的SELinux上下文。

# ls -Z /data/var/lib/mysql
drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 thegeekstuff
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1
-rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0
..

注意:您也可以将-e选项与fcontext一起使用。这将使/ data及其子目录的上下文标签与/ var / lib / mysql的上下文标签相同

semanage fcontext -a -e /var/lib/mysql /data

适用于Ubuntu / Debian上MySQL的AppArmor设置

将MySQL数据目录移动到新位置后,如果不执行以下操作,则在Ubuntu上,启动mysql数据库时会出现此错误:“(errno: 13)”(没有权限)。

如下所示修改usr.sbin.mysqld文件,并添加以下两行。请不要忘记在行尾添加逗号。

# vi /etc/apparmor.d/usr.sbin.mysqld
/data/var/lib/mysql/ r,
/data/var/lib/mysql/** rwk,

接下来,执行以下命令为mysql重新解析此新的apparmor配置文件,然后重新启动apparmor。

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

sudo /etc/init.d/apparmor reload

注意:或者,您也可以在AppArmor别名文件中添加别名,如下所示。同样,请不要忘记此别名行末尾的逗号。

# vi  /etc/apparmor.d/tunables/alias
alias /var/lib/mysql/ -> /newpath/,

MySQL客户端套接字参数

完成上述更改后,从mysql客户端连接时,您可能会收到此错误消息:ERROR 2002(HY000):可以’通过套接字连接到本地MySQL服务器‘/var/lib/mysql/mysql.sock’ (2)

# mysql -u root -pMyPassword
ERROR 2002 (HY000): Can'通过套接字连接到本地MySQL服务器'/var/lib/mysql/mysql.sock' (2)

如果发生这种情况,请通过–将套接字参数指向mysql客户端,然后将其指向新目录下的mysql.sock文件。

mysql -u root -pMyPassword --socket=/data/var/lib/mysql/mysql.sock

如果在本地调用mysql客户端,则还可以使用-h选项并传递127.0.0.1,如下所示。这也将避免mysql.sock错误消息。

mysql -u root -pMyPassword -h127.0.0.1

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 8 评论 … 加一 }

  • 2016年5月12日,上午3:23

    这是一本很好的简短手册!
    谢谢!

  • hemant贾达夫 2016年6月2日,晚上10:52

    简单而简短的方法。我遇到了这里讨论的所有问题。现在,一些步骤后面的逻辑很清楚了。

  • 科莱特 2016年6月6日,上午8:18

    为什么不执行以下操作:

    1.停止mysqld
    2.将/ var / lib / mysql重命名为/ var / lib / mysql-backup
    3.在RAID阵列或硬盘驱动器上创建具有足够空间的卷
    4.在/ var / lib / mysql下挂载该卷
    5.将所有文件从/ var / lib / mysql-backup复制到/ var / lib / mysql
    6.启动myslqd

    这样,mysql数据库仍位于原始位置。

  • 托马斯 2016年6月10日,上午9:25

    使用chcon命令进行的更改无法在文件系统重新标记或执行restorecon命令后继续存在。忘记chcon命令,并始终使用semanage。

  • 希瑟 2016年7月19日,下午6:21

    谢谢你的快速& easy!

    回覆:“ERROR 2002 (HY000): Can’通过套接字连接到本地MySQL服务器‘/var/lib/mysql/mysql.sock’ (2)” –为防止此错误,可以将套接字位置添加到my.cnf文件中,例如:

    [客户]
    套接字= / newpath / to / mysql / mysql.sock

  • 斯文野蛮人 2016年12月27日,晚上7:22

    令我感到困惑的一天(运行Ubuntu)的额外注释会给我与您未配置AppArmour时期望的错误相同的错误,即:

    (通过systemctl)启动mysql:mysql.service的mysql.serviceJob失败,因为控制进程退出并显示错误代码。看到“systemctl状态mysql.service” and “journalctl -xe” for details

    是MySql是否要求默认数据目录存在,即使未指向该目录也是如此。通过创建目录来修复:

    须藤mkdir / var / lib / mysql / mysql -p

    从这里拿起 这里 ,我整天都忽略了它,因为没有其他地方提到它,而且它看起来太傻了。

  • 阿尼鲁德·亚达夫(Anirudh yadav) 2016年12月28日,下午5:35

    出于某种原因,每当我在更改数据目录后启动mysql时,都会看到此错误(遵循以下说明: http://www.jnpkwjx.com/2016/05/move-mysql-directory/comment-page-1/)的东西。

    2016-12-28T23:12:48.369028Z 0 [Note] InnoDB: Loading buffer pool(s) from /数据/ mysql / var / lib / mysql // ib_buffer_pool
    2016-12-28T23:12:48.369217Z 0 [错误] InnoDB:无法打开‘/数据/ mysql / var / lib / mysql // ib_buffer_pool’阅读:权限被拒绝
    2016-12-28T23:12:48.369344Z 0 [Note]插件‘FEDERATED’ is disabled.
    2016-12-28T23:12:48.377825Z 0 [Note]服务器主机名(绑定地址):‘*’; port: 3306
    2016-12-28T23:12:48.378334Z 0 [注意] IPv6可用。
    2016-12-28T23:12:48.378352Z 0 [注意]– ‘::’ resolves to ‘::’;
    2016-12-28T23:12:48.378370Z 0 [注意]在IP上创建的服务器套接字:‘::’.
    2016-12-28T23:12:48.378770Z 0 [错误]无法创建UNIX套接字锁定文件/data/mysql/var/lib/mysql/mysql.sock.lock。
    2016-12-28T23:12:48.378779Z 0 [错误]无法设置Unix套接字锁定文件。
    2016-12-28T23:12:48.378783Z 0 [错误]中止
    我检查了我的审核报告,以查看它是否报告了有关那些权限问题的内容,但我什么也没看到:

    [root @ RCOVLNX3081〜]#cat /var/log/audit/audit.log | grep ib_buffer_po
    [root @ RCOVLNX3081〜]#cat /var/log/audit/audit.log | grep mysql.sock.lock
    [root @ RCOVLNX3081〜]#
    我还检查了文件的安全上下文,并确保mysql_db_t可以访问该文件

    [root @ RCOVLNX3081〜]#ls -RZ / data / mysql / var / lib / | grep ib_buffer_pool
    -rw-r—–。 mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_buffer_pool
    用我更改的权限强制使用任何权限问题:

    [root @ RCOVLNX3081〜]#chcon -Rt mysqld_db_t / data / mysql / var / lib / mysql
    [root @ RCOVLNX3081〜]#ls -RZ / data / mysql / var / lib / | grep -v mysqld_db_t
    / data / mysql / var / lib /:

    / data / mysql / var / lib / mysql:

    / data / mysql / var / lib / mysql / mysql:

    / data / mysql / var / lib / mysql / performance_schema:

    / data / mysql / var / lib / mysql / sys:
    还是一样的错误。请帮忙。

    这是my.cnf文件的内容:

    #有关如何更改设置的建议,请参阅
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

    [mysqld]
    #
    #删除前导#并设置为最重要数据的RAM数量
    #在MySQL中缓存。从专用服务器总RAM的70%开始,否则为10%。
    #innodb_buffer_pool_size = 128M
    #
    #删除开头的#以打开一个非常重要的数据完整性选项:日志记录
    #更改备份之间的二进制日志。
    #log_bin
    #
    #删除开头的#来设置主要对报表服务器有用的选项。
    #服务器默认设置对于事务和快速SELECT更快。
    #根据需要调整大小,尝试寻找最佳值。
    #join_buffer_size = 128M
    #sort_buffer_size = 2M
    #read_rnd_buffer_size = 2M
    #datadir = / var / lib / mysql
    #socket = / var / lib / mysql / mysql.sock

    datadir = /数据/ mysql / var / lib / mysql
    套接字= /数据/mysql/var/lib/mysql/mysql.sock

    #建议禁用符号链接以防止各种安全风险
    symbolic-links = 0

    日志错误= / var / log / mysqld.log
    pid文件= / var / run / mysqld / mysqld.pid

  • 安南思 2017年4月2日,上午11:56

    您好Anirudh,希望您可能已经解决了您的问题。从您的错误日志看来,由于innodb_buffer池,innodb引擎已失败。我建议您将innodb_buffer_pool_size值设置为系统RAM大小的70%以上。

发表评论