如何更改MySQL数据目录?

MyS*_*DBA 147 mysql directory default

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

小智 253

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

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

    sudo cp -R -p /var/lib/mysql /newpath
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用以下命令编辑MySQL配置文件:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
    
    Run Code Online (Sandbox Code Playgroud)
  4. 查找条目datadir,并将路径(应该是/var/lib/mysql)更改为新数据目录.

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

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
    
    Run Code Online (Sandbox Code Playgroud)
  6. 寻找以...开头的行/var/lib/mysql./var/lib/mysql使用新路径更改行.

  7. 保存并关闭文件.

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

    sudo /etc/init.d/apparmor reload
    
    Run Code Online (Sandbox Code Playgroud)
  9. 使用以下命令重启MySQL:

    sudo /etc/init.d/mysql restart
    
    Run Code Online (Sandbox Code Playgroud)
  10. 现在登录MySQL,您可以访问之前的相同数据库.

  • 以上在Ubuntu 12.04(精确版)上无法解决问题.我发现需要编辑文件/etc/apparmor.d/tunables/alias以包含一行"alias/var/lib/mysql/ - >/newpath /",有了这个,我不需要任何任何其他AppArmor文件中的更改.它在使用"/etc/init.d/apparmor restart"和MySQL"重启mysql"重启AppArmor后立即工作. (33认同)
  • 在mak的版本(这是必要的)不要忘记行的结尾`alias/var/lib/mysql/ - >/newpath /,` (11认同)
  • 这对我来说对mak的评论很有用(Ubuntu 12) (3认同)
  • 对我不起作用。我得到 mysql.service 的 Job 失败。尝试重新启动mysqld时的详细信息请参阅'systemctl status mysql.service'和'journalctl -xn',错误是磁盘已满。它有 500GB 的可用空间... (3认同)
  • Apparmor与CentOS无关.而是SELinux.可以在这里阅读如何禁用或管理https://blogs.oracle.com/jsmyth/entry/selinux_and_mysql (2认同)
  • 不能强调Michel上面评论的重要性是:添加TRAILING COMMA并保存一些神经元.对不起帽子很抱歉. (2认同)

Rag*_*geZ 14

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

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/
Run Code Online (Sandbox Code Playgroud)

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

  • 否决,因为它无法按照http://serverfault.com/a/733998/279553上的详细说明进行操作 (2认同)

H6.*_*H6. 13

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

# /etc/init.d/mysql stop
Run Code Online (Sandbox Code Playgroud)

之后你应该复制旧的数据目录(例如/ var/lib/mysql)incl.通过的新目录的权限

# cp -R -p /var/lib/mysql /new/data/dir
Run Code Online (Sandbox Code Playgroud)

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

# /etc/init.d/mysql restart
Run Code Online (Sandbox Code Playgroud)

  • 因为它在http://serverfault.com/a/733998/279553上没有详细说明而被投票 (5认同)

sMy*_*les 11

快速简便:

# 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/
Run Code Online (Sandbox Code Playgroud)

编辑/etc/my.cnf文件,然后[mysqld]添加以下行:

datadir=/new/dir/for/mysql/
Run Code Online (Sandbox Code Playgroud)

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

/etc/cagefs/cagefs.mp
Run Code Online (Sandbox Code Playgroud)

然后运行此命令:

cagefsctl --remount-all
Run Code Online (Sandbox Code Playgroud)

  • 我在您的位置找不到文件 my.cnf,而是在这里:`/etc/mysql/mysql.conf.d/mysqld.cnf` (2认同)

小智 8

如果像我一样使用 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 文档上为我找到了解决方案。希望这可以帮助一些人!

  • 对于使用 **MariaDB** 的用户,**service** 文件位于 **/lib/systemd/system/mariadb@.service** (2认同)

Pre*_*Tiw 6

如果您是 Windows 用户并登陆这里发现所有答案都适用于 Linux 用户,请不要失望!我不会让你像我那样浪费时间。

解决方案前的一些废话:

MySQL 使用一个 Data 目录来存储您创建的不同数据库的数据。好吧,最后,它必须以文件的形式存储它们,并在应用程序和文件格式中添加一些杂耍,以确保您在 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)
Run Code Online (Sandbox Code Playgroud)

Step - 2 : 找出当前的Data目录

 Goto C:\ProgramData\MySQL\MySQL Server 8.0
Run Code Online (Sandbox Code Playgroud)

默认情况下,这里应该有一个名为 的文件夹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
Run Code Online (Sandbox Code Playgroud)

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

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X
Run Code Online (Sandbox Code Playgroud)

并将复制的文件夹重命名为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.
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这很有帮助,但警告:除非您更改其权限,否则普通用户无法写入 my.ini。哦,ProgramData 是一个隐藏文件夹,因此您必须更改资源管理器文件夹设置才能看到它。 (2认同)

wfb*_*ale 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
Run Code Online (Sandbox Code Playgroud)

然后当你想要切换回来时,只需:

mv mysql mysql.remote

mv mysql.local mysql
Run Code Online (Sandbox Code Playgroud)

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


小智 5

首先停止mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data
Run Code Online (Sandbox Code Playgroud)

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

注意:
#1:可能你必须调整你的SELinux设置(尝试在发生故障时禁用SELinux),Apparmor(Ubuntu)也可能会出问题.

#2:请参阅MySQL安装数据库参考


小智 5

首先停止你的mysql

sudo service mysql stop
Run Code Online (Sandbox Code Playgroud)

将mysql数据复制到新位置。

sudo cp -rp /var/lib/mysql /yourdirectory/
Run Code Online (Sandbox Code Playgroud)

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

sudo vim /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

将 where /var/lib/ 替换为 /yourdirectory/ 然后将以下内容添加到文件中(如果不存在)

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,
Run Code Online (Sandbox Code Playgroud)

使用命令保存文件

:wq
Run Code Online (Sandbox Code Playgroud)

编辑文件 my.cnf

sudo vim /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)

用 /yourdirectory/ 替换 where /var/lib/ 然后用命令保存

:wq
Run Code Online (Sandbox Code Playgroud)

最后启动mysql

sudo service mysql start
Run Code Online (Sandbox Code Playgroud)

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

  • 我知道人们对此表示反对,但我想告诉你,这救了我的一天。谢谢! (2认同)

Ely*_*deh 5

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

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

禁用 SELinux

首先,我要提一下基于 RedHat 的 Linux 发行版(RHEL),例如FedoraCentOS使用强制执行强制访问控制策略的SELinux 。因此,最好disable在以下步骤中使用它,然后通过一些调整来启用它。

打开SELinux配置文件

nano /etc/selinux/config
Run Code Online (Sandbox Code Playgroud)

找到包含的行SELINUX=enforcing并将其值更改为SELINUX=disabled保存文件并重新启动系统。

更改MySQL的datadir

停止MySQL服务

systemctl stop mysqld.service
Run Code Online (Sandbox Code Playgroud)

为MySQl的数据目录创建一个新目录。由于某些原因超出了此解决方案的范围,强烈建议不要在该/home目录下创建数据目录,但也许你们中的一些人像我一样更喜欢它(它需要更多步骤)。

mkdir /home/eloy/applications/mysql-datadir/
Run Code Online (Sandbox Code Playgroud)

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

chown --reference=/var/lib/mysql   /home/eloy/applications/mysql-datadir/
chmod --reference=/var/lib/mysql   /home/eloy/applications/mysql-datadir/
Run Code Online (Sandbox Code Playgroud)

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

cp -rp /var/lib/mysql/*   /home/eloy/applications/mysql-datadir/
Run Code Online (Sandbox Code Playgroud)

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

[mysqld]
datadir=/home/eloy/applications/mysql-datadir/
Run Code Online (Sandbox Code Playgroud)

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

systemctl start mysqld.service
Run Code Online (Sandbox Code Playgroud)

但是如果数据目录是在 下创建的/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
Run Code Online (Sandbox Code Playgroud)

解决/home问题

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

chmod +x /home/eloy/applications/mysql-datadir
chmod +x /home/eloy/applications
chmod +x /home/eloy/
chmod +x /home
Run Code Online (Sandbox Code Playgroud)

正如前面提到的,在/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 
Run Code Online (Sandbox Code Playgroud)

将以下行复制到新centreon.conf 文件并保存

[Service]
ProtectHome=false 
#ProtectSystem=off
Run Code Online (Sandbox Code Playgroud)

通过运行以下命令应用更改

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

现在您可以运行 MySQL 服务:

systemctl start mysqld.service
Run Code Online (Sandbox Code Playgroud)

启用 SELinux

再次编辑该/etc/selinux/config文件,并将行更改SELINUX=disabledSELINUX=enforcing。保存文件并重新启动系统。

要查询 SELinux 的当前状态,请使用以下命令,它应该enforcing作为输出打印。

getenforce
Run Code Online (Sandbox Code Playgroud)

如果未正确设置,则使用SELinux context过程将中止,因此您需要更新它:mysqld_db_tmysqld

semanage fcontext -a -t mysqld_db_t "/home/eloy/applications/mysql-datadir(/.*)?"

restorecon -Rv /home/eloy/applications/mysql-datadir
Run Code Online (Sandbox Code Playgroud)

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