如何更改MySQL数据目录?

时间:2009-11-25 07:13:34

标签: mysql directory default

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

21 个答案:

答案 0 :(得分:249)

  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,您可以访问之前的相同数据库。

答案 1 :(得分:13)

首先你应该停止mysql服务器。 e.g。

# /etc/init.d/mysql stop

之后你应该复制旧数据目录(例如/ var / lib / mysql)incl。通过

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

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

# /etc/init.d/mysql restart

答案 2 :(得分:12)

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

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

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

答案 3 :(得分: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

答案 4 :(得分: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

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

答案 5 :(得分:5)

首先停止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

答案 6 :(得分: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

的信息

答案 7 :(得分:3)

此解决方案适用于使用Workbench的Windows 7。您将需要管理员权限才能执行此操作。它创建了一个连接点(如快捷方式),可以存储您真正想要存储数据的地方

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

https://bitsum.com/junctionmaster.php

安装Junction Master

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

右键单击Data并选择“MOVE然后将LINK文件夹设置为...” 接受警告 将目标指向“此处没有引号的新数据目录” 点击移动和链接

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

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

返回Workbench并启动服务器

这种方法适用于我在Windows 7 Enterprise上使用MySQL Workbench 6.2。

答案 8 :(得分:3)

如果像我一样,您使用的是debian,并且想将mysql目录移动到您的家庭或/ home / ...上的路径,则解决方法是:

  • 通过“ sudo服务mysql停止”停止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”重新加载系统
  • 通过“服务mysql重新启动”重新启动mysql

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

答案 9 :(得分:2)

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

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

并将其改为:

[mysqld]
datadir=/vagrant/mq/mysql

以这种方式

  • 您无需更改现有文件(自动化脚本更容易)
  • MySQL版本没有问题(而且是配置!)更新。

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

我们不得不将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

答案 12 :(得分: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中可用:https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

答案 13 :(得分:1)

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

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

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

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

所以您执行以下操作。

步骤-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将默认的datadir复制到W:\。启动命令提示符(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服务已启动然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。” -礼貌: Microsoft

步骤-4 :重新启动服务

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

步骤-5 :完成!现在开始工作!

答案 14 :(得分:0)

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

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

配置文件可能会出现在

  

/etc/mysql/my.cnf

数据文件可能会出现在

  

的/ var / lib中/ MySQL的

你应该做的是

  1. 停止mysql
  2. 将mysql数据更改为新dirctory
  3. 更改配置文件
  4. 重新加载配置文件
  5. 重启mysql
  6. 然后完成工作。

    但如果您没有使用apt或yum安装它,则可能不喜欢这样 ,你可以用

    找到mysql文件
      

    whereis mysql

答案 15 :(得分:0)

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

在/ var / lib /中:

   // Include standard libraries
   #include <cstdlib>
   #include <cmath>
   #include <vector>
   #include <array>
   #include <iostream>


   int main(int nargs, char* args[])
   {
    std::cout << "bessel function " << jn(5./2., 1.) << "\n" ;
   }

我重启了mysql:

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

但怀疑即使这不是必要的。

答案 16 :(得分:0)

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

我按照以下步骤更改了优秀的数据目录。 change mysql data directory in Linux

答案 17 :(得分:0)

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

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

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

答案 18 :(得分:0)

也可以符号链接数据目录。至少在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。

答案 19 :(得分:0)

除了已接受的答案,如果您想在 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。这里的一个重要细节是 = 左侧的字符是制表符,右侧的字符是空格。我花了一段时间才找到它。

答案 20 :(得分:-1)

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