如何更改 MySQL 数据目录?

Posted

技术标签:

【中文标题】如何更改 MySQL 数据目录?【英文标题】:How to change MySQL data directory? 【发布时间】:2010-12-20 04:36:45 【问题描述】:

是否可以将我的默认 mysql 数据目录更改为另一个路径?我可以从旧位置访问数据库吗?

【问题讨论】:

对于 windows - 看这里:dba.stackexchange.com/questions/24403/… 对于 mac 用户,您只需要this 和@user1341296 答案中的 1-4 步。 【参考方案1】:

我可以成功修改MySQLMariaDB的数据目录,解决Fedora 30上的所有相关问题。我认为以下步骤适用于其他发行版。

注意:Debian-based 发行版如Ubuntu 的用户应搜索如何禁用和编辑AppArmor,然后按照以下步骤操作。

禁用 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/eloy/applications/mysql-datadir/

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

chown --reference=/var/lib/mysql   /home/eloy/applications/mysql-datadir/
chmod --reference=/var/lib/mysql   /home/eloy/applications/mysql-datadir/

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

cp -rp /var/lib/mysql/*   /home/eloy/applications/mysql-datadir/

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

[mysqld]
datadir=/home/eloy/applications/mysql-datadir/

现在您可以通过以下命令启动您的 MySQL 服务

systemctl start mysqld.service

但是如果数据目录是在/home下创建的,MySQL将无法启动,在journalctl -xe之后会出现以下错误和警告:

Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Could not increase number of max_open_files to more than 16384 (request: 32190) 
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Can't create test file /home/eloy/applications/mysql-datadir/eloy-fedora-laptop.lower-> 
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: [113B blob data] 
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [ERROR] Aborting

解决/home 问题

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

chmod +x /home/eloy/applications/mysql-datadir
chmod +x /home/eloy/applications
chmod +x /home/eloy/
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/eloy/applications/mysql-datadir(/.*)?"

restorecon -Rv /home/eloy/applications/mysql-datadir

现在您可以运行 MySQL。 干杯;-)

【讨论】:

【参考方案2】:

我遵循@sMyles 的指南,但未能再次启动 mysqld。我们为什么不做一个软链接来改变datadir?

sudo cp -rp /var/lib/mysql /home/workspace
sudo mv /home/workspace/mysql /home/workspace/mysql_data
sudo chown --reference=/var/lib/mysql /home/workspace/mysql_data
sudo chmod --reference=/var/lib/mysql /home/workspace/mysql_data
sudo systemctl stop mysqld
sudo mv /var/lib/mysql /var/lib/mysql.orig
sudo ln -s /home/workspace/mysql_data /var/lib/mysql
sudo systemctl start mysqld

【讨论】:

【参考方案3】:

除了接受的答案之外,如果您想在 bash 脚本或 dockerfile 中以编程方式更改配置文件中的 datadir,您可以使用 sed:

sed -i 's|# datadir\t= /var/lib/mysql|datadir\t= custom_path|g' /etc/mysql/mysql.conf.d/mysqld.cnf

这将取消设置并将值设置为custom_path。这里的一个重要细节是= 左侧的字符是一个制表符,而右侧的字符是一个空格。我花了一段时间才找到它。

【讨论】:

【参考方案4】:

也可以对数据目录进行符号链接。至少在 macOS 开发环境中。

(自制) e. g.

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

重启mysql。

【讨论】:

【参考方案5】:

以上步骤是基础和基本的。我跟着他们,仍然得到“mysql无法启动”的错误。

对于存储 mysql 数据的新文件夹,您需要确保 该文件夹具有权限和所有权 mysql:mysql。

除此之外,如果有/data/mysql/,它需要检查mysql 父目录的权限和所有权。这里 /data/ 目录应该是 root:root。在更改/mysql的父目录的所有权后,我修复了“mysql无法启动”的错误。 我的 VM 中的操作系统是 RHEL 7.6。

【讨论】:

我在 RHEL7.6 中尝试了 selinux,将 SELINUX=enforcing 更改为 SELINUX=permissive,但对我不起作用。【参考方案6】:

如果你像我一样在 debian 上,并且想将 mysql 目录移动到你的家或 /home/... 上的路径,解决方案是:

通过“sudo service mysql stop”停止mysql 将“datadir”变量更改为“/etc/mysql/mariadb.conf.d/50-server.cnf”中的新路径 备份 /var/lib/mysql :“cp -R -p /var/lib/mysql /path_to_my_backup” 删除此目录:“sudo rm -R /var/lib/mysql” 将数据移动到新目录:“cp -R -p /path_to_my_backup /path_new_dir 通过“sudo chown -R mysql:mysql /path_new_dir”更改访问权限 在“/etc/systemd/system/mysqld.service”上将变量“ProtectHome”更改为“false” 通过“sudo systemctl daemon-reload”重新加载 systemd 通过“service mysql restart”重启mysql

有一天在 mariadb 文档上为我找到解决方案。 希望这可以帮助一些人!

【讨论】:

文件 /etc/systemd/system/mysqld.service 不在这里。知道我要去哪里看吗? 对于那些使用 MariaDB 的用户,service 文件位于 /lib/systemd/system/mariadb@.service 【参考方案7】:

如果您是 Windows 用户并在这里发现所有答案都是针对 Linux 用户的,请不要失望!我不会让你像我一样浪费时间。

解决之前的废话:

MySQL 使用数据目录来存储您创建的不同数据库的数据。好吧,最后,它必须以文件的形式存储它们,并在应用程序和文件格式中添加一些杂耍,以确保您在 Databases 类中学到的 Database promise 是完整的。

现在您想确保有足够的空间来存储您将来可能创建的大型数据库,所以您想,嘿!我想把它放到另一个有更多空间的驱动器中。

所以你执行以下操作。

步骤 - 1:停止 MySQL 服务。

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Step - 2 : 找出当前数据目录

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

默认情况下,这里应该有一个名为Data的文件夹,就是这个文件夹 MySQL 在默认设置中使用(假设他们没有找到另一个更好的位置),但让我们检查一下。

找到my.ini 文件,应该就在那儿。

在编辑器中打开它(可能是 Notepad++)。

按 CTRL+F 在文件中找出datadir

这里提到的都是 MySQL 当前用于数据目录的实际位置。这就是你想要改变的。

第 3 步:将其替换为新的数据目录。

假设您希望您的新数据目录为 W:__MySQL_Data。让我们改变 将my.ini 文件中的datadir 值设置为该值。保留以前的值注释,这样您就不必记住它。

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

现在使用xcopy 将默认的datadir 复制到W:\。启动命令提示符(Window + R、cmd、Enter)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

并将复制的文件夹重命名为您更改的新 datadir 值。这里:W:/__MySQL_Data

为什么不简单地复制?好吧,因为那不是很酷!,这有助于您不会丢失复制文件夹的权限,因此当您重新启动MySQL80时,它不会给出愚蠢的错误:“本地计算机上的MySQL80服务启动然后停止。一些服务如果它们未被其他服务或程序使用,则会自动停止。” - 礼貌:微软

步骤 - 4:重启服务

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

步骤 - 5:完成!现在回去工作!!

【讨论】:

感谢您的帮助,但警告:除非您更改其权限,否则普通用户无法写入 my.ini。哦,ProgramData 是一个隐藏文件夹,因此您必须更改 Explorer 文件夹设置才能看到它。【参考方案8】:

对于其中一种环境,我将 mysql 数据目录更改为新位置,但在 mysql 服务器重新启动期间,这需要时间。所以我检查了端口,发现其他进程正在监听 mysql 端口。所以我终止了进程并重新启动了mysql服务器,它运行良好。

我按照以下步骤更改数据目录,效果很好。 change mysql data directory in Linux

【讨论】:

欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案9】:

快速简单的操作:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

编辑/etc/my.cnf 文件,在[mysqld] 下添加这一行:

datadir=/new/dir/for/mysql/

如果您使用 CageFS(有或没有 CloudLinux)并且想要更改 MySQL 目录,则必须将新目录添加到此文件:

/etc/cagefs/cagefs.mp

然后运行这个命令:

cagefsctl --remount-all

【讨论】:

很高兴听到:P 非常感谢,如果你想像我一样完全编写脚本,你可以使用这个: sed -i 's|datadir=/var/lib/mysql|datadir=/data/var /lib/mysql|g' /etc/my.cnf 这对我不起作用。我尝试了这个和许多不同的其他选择。当他说这是唯一可行的方法时,我得出与 user3338098 相同的结论:serverfault.com/questions/503887/… @Volksman 所有链接都说他必须删除并重新安装......你们可能都有其他服务器特定的问题,因为 MySQL 和 MariaDB 都支持 datadir 配置,我最近做了这(6 个月前)在另一台服务器上没有问题 我在您的位置找不到 my.cnf 文件,而是在这里:/etc/mysql/mysql.conf.d/mysqld.cnf【参考方案10】:

    使用以下命令停止 MySQL:

    sudo /etc/init.d/mysql stop
    

    使用以下命令复制现有数据目录(默认位于/var/lib/mysql):

    sudo cp -R -p /var/lib/mysql /newpath
    

    使用以下命令编辑 MySQL 配置文件:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
    

    查找datadir 的条目,并将路径(应为/var/lib/mysql)更改为新数据目录。

    在终端输入命令:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
    

    查找以/var/lib/mysql 开头的行。用新路径更改行中的/var/lib/mysql

    保存并关闭文件。

    使用以下命令重新启动 AppArmor 配置文件:

    sudo /etc/init.d/apparmor reload
    

    使用命令重启 MySQL:

    sudo /etc/init.d/mysql restart
    

    现在登录 MySQL,您可以访问以前的数据库。

【讨论】:

上述方法未能在 Ubuntu 12.04(精确)上为我解决问题。我发现需要编辑文件 /etc/apparmor.d/tunables/alias 以包含一行“alias /var/lib/mysql/ -> /newpath/” 有了这个,我不需要任何任何其他 AppArmor 文件中的更改。它在使用“/etc/init.d/apparmor restart”重启 AppArmor 和使用“restart mysql”重启 MySQL 后立即工作。 Apparmor 与 CentOS 无关。取而代之的是 SELinux。可以在这里阅读如何禁用或管理blogs.oracle.com/jsmyth/entry/selinux_and_mysql 在 mak 的版本上(这是必要的)不要忘记行尾的逗号alias /var/lib/mysql/ -> /newpath/, 怎么强调 Michel 上面的评论是多么重要:添加尾随逗号并保存一些神经元。对不起帽子。 对我不起作用。我得到 mysql.service 的作业失败。尝试重新启动mysqld时,请参阅'systemctl status mysql.service'和'journalctl -xn',错误是磁盘已满。它有 500GB 的可用空间...【参考方案11】:

如果您想以编程方式执行此操作(无需使用 gedit 手动输入文本),这里有一个基于 user1341296 上述答案的 Dockerfile 版本:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

在 Docker hub 上可用:https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

【讨论】:

【参考方案12】:

首先你应该停止 mysql 服务器。例如

# /etc/init.d/mysql stop

之后,您应该复制旧数据目录(例如 /var/lib/mysql),包括。通过

访问您的新目录的权限
# cp -R -p /var/lib/mysql /new/data/dir

现在您可以在/etc/mysql/my.cnf 中更改新数据并重新启动服务器

# /etc/init.d/mysql restart

【讨论】:

投了反对票,因为它不像 serverfault.com/a/733998/279553 详细说明的那样工作【参考方案13】:

在 SuSE 13.1 下,这可以很好地将 mysql 数据目录移动到其他地方,例如到 /home/example_user/ ,并给它一个更具信息性的名称:

在 /var/lib/ 中:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

我重启了mysql:

# systemctl restart mysql.service

但怀疑即使那样也没有必要。

【讨论】:

【参考方案14】:

我们不得不将 MySQL 移动到 /home 目录,因为它是从另一个物理磁盘映射的。为了让生活更简单,我们没有更改 my.cnf 中的目录,而是将新目录/home/mysql 映射到原目录/var/lib/mysql 的位置。它对我们来说就像一个魅力(在 CentOS 7.1 上测试)。

创建新目录并设置正确的权限。

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

如果 MySQL 正在运行,请停止。

systemctl stop mysql

移动数据目录。

mv -f /var/lib/mysql/* /home/mysql

创建一个永久挂载并执行它。

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

重启服务器。

systemctl start mysql

【讨论】:

【参考方案15】:

首先停止你的mysql

sudo service mysql stop

将mysql数据复制到新位置。

sudo cp -rp /var/lib/mysql /yourdirectory/

如果您使用 apparmor,请编辑以下文件并执行以下操作

sudo vim /etc/apparmor.d/usr.sbin.mysqld

将 /var/lib/ 替换为 /yourdirectory/,如果不存在则将以下内容添加到文件中

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

用命令保存文件

:wq

编辑文件 my.cnf

sudo vim /etc/mysql/my.cnf

将 /var/lib/ 替换为 /yourdirectory/ 然后使用命令保存

:wq

终于启动mysql了

sudo service mysql start

@查看更多关于raid0,优化ici

【讨论】:

投了反对票,因为它不像serverfault.com/a/733998/279553中详细说明的那样工作 也许这不适用于其他发行版,但如果您使用的是 ubuntu,这对我来说很好,我会更改每个新安装的 ubuntu 服务器的路径以启用 raid0。 我知道人们对此表示反对,但我想说的是,这拯救了我的一天。谢谢!【参考方案16】:

@user1341296 所说的一切,加上...

你最好不要改变/etc/mysql/my.cnf 相反,您想创建新文件/etc/mysql/conf.d/ext.cnf(任何名称,但扩展名应为cnf

把你的零钱放进去:

[mysqld]
datadir=/vagrant/mq/mysql

这样

您不需要更改现有文件(自动化脚本更容易) MySQL 版本(和它的配置!)更新没有问题。

【讨论】:

【参考方案17】:

首先停止mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

然后更改/etc/mysql/my.cnf中的datadir 启动mysqld

注意事项: #1:可能你必须调整你的 SELinux 设置(尝试禁用 SELinux 以防出现问题),Apparmor (Ubuntu) 也可能有问题。

#2:见MySQL Install DB Reference

【讨论】:

【参考方案18】:

此解决方案使用 Workbench 在 Windows 7 中运行。您需要管理员权限才能执行此操作。它为您真正想要存储数据的任何地方创建了一个连接(如快捷方式)

打开 Workbench 并选择 INSTANCE - Startup / Shutdown 停止服务器

从https://bitsum.com/junctionmaster.php安装Junction Master

导航到 C:\ProgramData\MySQL\MySQL Server 5.6

右键单击数据并选择“移动,然后将文件夹链接到...” 接受警告 将目标指向“您的新数据目录在此处不带引号” 点击移动和链接

现在转到“此处不带引号的新数据目录”

右击数据 转到安全选项卡 单击编辑 点击添加 键入 NETWORK SERVICE 然后检查名称 点击确定 单击允许完全控制复选框,然后单击确定

返回 Workbench 并启动服务器

此方法对我在 Windows 7 Enterprise 上使用 MySQL Workbench 6.2 有效。

【讨论】:

【参考方案19】:

首先,你应该知道你的配置文件在哪里?你的配置文件在哪里?

如果你是用 apt-get 或 yum install 安装的。

配置文件可能出现在

/etc/mysql/my.cnf

数据文件可能出现在

/var/lib/mysql

你应该做的是

    停止mysql 将 mysql 数据更改为新目录 修改配置文件 重新加载配置文件 重启mysql

然后工作完成。

但是如果你没有用apt或者yum安装的话,目录可能不是这样的 ,你可以找到mysql文件

mysql在哪里

【讨论】:

投了反对票,因为它不像serverfault.com/a/733998/279553中详细说明的那样工作【参考方案20】:

我在升级机器时经常需要这样做,从一个盒子移动到另一个盒子。除了将 /var/lib/mysql 移动到更好的位置之外,我还经常需要从旧的 MySQL 安装中恢复旧的数据库表。为了做到这一点...

    停止 mysql。请按照上述说明进行操作。 将数据库目录(每个旧安装的数据库都有一个目录)复制到新的 DATADIR 位置。但省略“mysql”和“performance_schema”目录。 复制的数据库目录之间的正确权限。所有权应该是 mysql:mysql,目录应该是 700,文件应该是 660。 重启mysql。根据您的安装,应该更新旧版本的数据库文件。

【讨论】:

抱歉投了反对票,这个解决方案可能是正确的,没有尝试过。【参考方案21】:

如果您使用的是 SE linux,请通过编辑 /etc/selinux/config 将其设置为许可模式 和改变 SELINUX=enforcing to SELINUX=permissive

【讨论】:

这里详述serverfault.com/questions/503887/… selinux 没有错误,还有其他问题阻止了datadir 属性的更改【参考方案22】:

我想在我的机器上保留一个数据库,但在我的外部硬盘驱动器上也有一个数据,并在使用两者之间切换。

如果您使用的是 Mac,并且使用 Homebrew 安装了 MySQL,那么这应该适合您。否则,您只需将适当的位置替换为您机器上的 MySQL datadir

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

当你想切换回来时,只需执行:

mv mysql mysql.remote

mv mysql.local mysql

并且您再次使用本地数据库。希望对您有所帮助。

【讨论】:

这并没有完全解决上述问题——但这正是我正在寻找的——它是处理 my.cnf 无法处理的边缘情况/错误的一种巧妙方法空格很好:bugs.mysql.com/bug.php?id=26033。我将在该错误报告中链接此解决方法。 投了反对票,因为它不像serverfault.com/a/733998/279553中详细说明的那样工作【参考方案23】:

您必须将当前数据复制到新目录并更改您的 my.cnf 您的 MySQL。

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

您必须在服务器未运行时复制数据库。

【讨论】:

那是我做不到的。我想更改目录,但我想在新目录中创建新数据库。并且想要访问旧目录和新目录数据库。 @MySQL DBA:如果你使用一些 ln -s 静态符号 lynx 不会成功吗? 嗯,我对这个命令的使用有点困惑。正如我之前解释的那样,我想在新目录中创建新数据库。是否可以使用符号链接。 您可以创建一个新目录,使用符号链接使文件出现在新目录中并更改您的my.cnf 投了反对票,因为它不像serverfault.com/a/733998/279553中详细说明的那样工作

以上是关于如何更改 MySQL 数据目录?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL技巧|为了方便备份和安全,MySQL数据库存放目录如何更改?

如何在 Xampp 上更改 mysql 数据库目录?

如何更改mysql数据存放路径

mysql 更改默认数据目录

linux mysql 安装源码包时啥参数指定数据库目录位置,rpm 包 安装后如何更改数据库目录位置

如何查看和更改mysql数据库文件存放位置