如何更改MySQL数据目录?


158

是否可以将默认的MySQL数据目录更改为其他路径?我可以从旧位置访问数据库吗?


3
如果Win8中的系统存在此问题的任何答案?
Jonathan M


对于Mac用户,您需要的就是这个,以及@ user1341296的答案中的1-4步骤。
shellbye

Answers:


270
  1. 使用以下命令停止MySQL:

    sudo /etc/init.d/mysql stop
  2. /var/lib/mysql使用以下命令复制现有数据目录(默认位于):

    sudo cp -R -p /var/lib/mysql /newpath
  3. 使用以下命令编辑MySQL配置文件:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. 查找的条目datadir,然后将路径(应为/var/lib/mysql)更改为新数据目录。

  5. 在终端中,输入命令:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. 寻找以开头的行/var/lib/mysql/var/lib/mysql用新路径更改行。

  7. 保存并关闭文件。

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

    sudo /etc/init.d/apparmor reload
  9. 使用以下命令重新启动MySQL:

    sudo /etc/init.d/mysql restart
  10. 现在登录到MySQL,您可以访问以前的数据库。


33
以上在Ubuntu 12.04(Precise)上无法为我解决问题。我发现需要编辑文件/etc/apparmor.d/tunables/alias使其包含一行“ alias / var / lib / mysql /-> / newpath /”,到此为止,我不需要任何内容​​。其他AppArmor文件中的更改。在使用“ /etc/init.d/apparmor restart”重新启动AppArmor和使用“ restart mysql”重新启动MySQL之后,它立即起作用。

2
Apparmor与CentOS无关。相反,有SELinux。在这里可以阅读有关如何禁用或管理博客的信息blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam

12
在mak版本上(必要时),请不要忘了在行尾使用逗号alias /var/lib/mysql/ -> /newpath/,
迈克尔

4
不能足够强调以上米歇尔评论的重要性:添加跟踪逗号并保存一些神经元。对不起帽子。
alx

2
对我不起作用。我得到mysql.service的Job失败。尝试重新启动mysqld时,请参见'systemctl status mysql.service'和'journalctl -xn'了解详细信息,并且错误是磁盘已满。它有500GB的可用空间...
Frank H.

17

快速简便:

# 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

1
很高兴听到:P
sMyles

非常感谢,如果要像我一样完全编写脚本,可以添加以下内容:sed -i's | datadir = / var / lib / mysql / datadir = / data / var / lib / mysql | g'/ etc / my.cnf
berimbolo

这对我不起作用。我尝试过这个,还有很多其他选择。我来了同样的结论为user3338098时,他说这是唯一的出路作品:serverfault.com/questions/503887/...
Volksman

@Volksman的所有链接都说他必须删除并重新安装...您可能都有其他特定于服务器的问题,因为MySQL和MariaDB都支持datadir配置,而我最近(6个月前)在另一个服务器上进行了此操作服务器没有问题
sMyles

@sMyles是的,它已被删除并安装,但是在其他地方挂载了/ var / lib / mysql之后,即与以前挂载到/ var不同的一个大型分区。如果我们的系统存在特定问题,那么最好解决这个问题。这是在带有8个HDD的RAID 10的Centos 7 OS的全新标准库存上安装的,但是通常这样的磁盘阵列详细信息对软件是透明的。
Volksman

15

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

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

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


那就是我做不到的。我想更改目录,但要在新目录中创建新数据库。并希望同时访问旧目录和新目录数据库。
MySQL DBA

1
@MySQL DBA:如果您使用一些ln -s静态符号天猫,那不是吗?
RageZ

好吧,我对此命令的使用感到困惑。如前所述,我想在新目录中创建新数据库。是否可以使用symlink。
MySQL DBA

1
您可以创建一个新目录,使用符号链接使该文件显示在新目录中,并更改您的my.cnf
RageZ 2009年

2
否决票是因为它不能按serverfault.com/a/733998/279553上的
2015年

14

首先,您应该停止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

5
否决票是因为它不能按serverfault.com/a/733998/279553上的
2015年

7

如果像我一样,您使用的是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”上通过“ false”更改变量“ ProtectHome”
  • 通过“ sudo systemctl daemon-reload”重新加载systemd
  • 通过“ service mysql restart”重启mysql

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


文件/etc/systemd/system/mysqld.service不在这里。知道我要去哪里吗?
罗恩·皮格特

1
对于使用MariaDB的用户,服务文件位于/lib/systemd/system/mariadb@.service
Ron Piggott

5

我想在我的机器上保留一个数据库,但还要在外部硬盘驱动器上保留一个数据,然后在使用两者之间进行切换。

如果您使用的是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

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


1
这不能完全解决所陈述的问题-但这正是我在寻找的东西-这是一种处理my.cnf不能很好处理空间的边缘案例/错误的好方法:bugs.mysql.com /bug.php?id=26033。我将将此解决方法链接到该错误报告。
gabe 2013年

否决票是因为它不能按serverfault.com/a/733998/279553上的
2015年

5

首先停止mysqld

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

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

注意:
#1:可能您必须调整SELinux设置(如果遇到麻烦,请禁用SELinux进行尝试),也可能会出现Apparmor(Ubuntu)。

#2:请参阅《MySQL Install DB参考》


4

首先停止你的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上的
2015年

也许这不适用于其他发行版,但是如果您使用的是ubuntu,则对我而言效果很好,我会更改每个新安装的ubuntu服务器的路径以启用raid0。
naddame

2
我知道人们对此表示不满,但我想对您说,这挽救了我的生活。谢谢!
Daniel Loureiro

3

此解决方案在Windows 7中使用Workbench起作用。您将需要管理员权限才能执行此操作。它会在您真正想要存储数据的地方创建一个结点(如快捷方式)

打开Workbench并选择INSTANCE-启动/关闭停止服务器

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

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

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

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

右键单击“数据”,然后转到“安全性”选项卡。单击“编辑”,单击“添加类型”,然后单击“检查名称”,然后单击“确定”。单击“允许完全控制”复选框,然后单击“确定”。

返回工作台并启动服务器

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


2

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

您最好不要更改,/etc/mysql/my.cnf 而是要创建新文件/etc/mysql/conf.d/ext.cnf(任何名称,但扩展名应为cnf

并放入您的更改:

[mysqld]
datadir=/vagrant/mq/mysql

通过这种方式

  • 您不需要更改现有文件(更容易使用自动化脚本)
  • MySQL版本(及其配置!)更新没有问题。

2

如果您是Windows用户并且登陆此处以查找所有答案均适用于Linux用户,请不要失望!我不会让你像我那样浪费时间。

解决方案前的一些胡说八道:

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

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

因此,请执行以下操作。

步骤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)

步骤2:找出目前的资料目录

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

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

查找my.ini文件,应该在那里。

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

执行CTRL + F datadir在文件中查找。

这里提到的是MySQL当前用于数据目录的实际位置。这就是您要更改的内容。

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

假设您希望新数据目录为W:__ MySQL_Data。让我们改变 datadir在价值my.ini文件到这个值。保留前面的值,以便您不必记住它。

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

现在使用xcopy将默认值复制datadirW:\。启动命令提示符(Window + R,cmd,Enter)

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

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

为什么不简单地复制?好吧,因为那不是COOL !,这可以帮助您避免丢失对复制文件夹的权限,因此,当您重新启动时MySQL80,它不会出现愚蠢的错误:“本地计算机上的MySQL80服务已启动,然后停止。它们未被其他服务或程序使用。” -礼貌:微软

步骤4:重新启动服务

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

步骤5:完成!现在恢复工作!


1
谢谢,这很有帮助,但警告:普通用户不能写入my.ini,除非您更改其权限。哦,ProgramData是一个隐藏的文件夹,因此您必须更改Explorer文件夹设置才能看到它。
JonP '18 -10-5

1

升级机器时,在箱子之间移动时,我经常需要这样做。除了将/ var / lib / mysql移至更好的位置之外,我通常还需要从旧的MySQL安装还原旧的DB表。为此...

  1. 停止mysql。请按照上面的说明进行操作,必要时。
  2. 将数据库目录(每个旧安装的数据库都有一个目录)复制到新的DATADIR位置。但是省略“ mysql”和“ performance_schema”目录。
  3. 在复制的数据库目录中更正权限。所有权应为mysql:mysql,目录应为700,文件应为660。
  4. 重新启动mysql。根据您的安装,应更新旧版本的DB文件。

不好意思,这个解决方案可能是正确的,还没有尝试过。
user3338098 2015年

1

我们必须将MySQL移到/home目录中,因为它是从另一个物理磁盘映射的。为了简化工作流程,我们将新目录映射/home/mysql到原始目录的位置,而不是在my.cnf中更改目录/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

1

如果您想以编程方式执行此操作(不使用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/


0

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

如果您使用apt-get或yum install进行安装。

配置文件可能会出现在

/etc/mysql/my.cnf

数据文件可能会出现在

/ var / lib / mysql

而你应该做的是

  1. 停止mysql
  2. 将mysql数据更改为新目录
  3. 更改配置文件
  4. 重新加载配置文件
  5. 重启mysql

然后完成工作。

但是,如果您未使用apt或yum安装它,则目录可能不会这样,您可以使用以下命令找到mysql文件

MySQL在哪里


否决票是因为它无法按照serverfault.com/a/733998/279553上的
2015年

0

在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

但是怀疑那是没有必要的。


0

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

我按照以下步骤更改了数据目录,效果很好。 在Linux中更改mysql数据目录


欢迎使用Stack Overflow!尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
蒂姆·迪克曼

0

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

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

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


我通过将SELINUX = enforceing更改为SELINUX = permissive在RHEL7.6中尝试了selinux,这对我不起作用。
user3325137William

0

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

(自制)例如

# 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。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.