如何更改 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】:我可以成功修改MySQL或MariaDB的数据目录,解决Fedora 30上的所有相关问题。我认为以下步骤适用于其他发行版。
注意:Debian-based
发行版如Ubuntu
的用户应搜索如何禁用和编辑AppArmor
,然后按照以下步骤操作。
禁用 SELinux
首先,让我提一下 基于 RedHat 的 Linux 发行版 (RHEL),例如 Fedora、CentOS、等。使用强制访问控制策略的 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数据库存放目录如何更改?