如何更改 MySQL 数据目录?

是否可以将默认的 MySQL 数据目录更改为其他路径?我能从旧地址进入数据库吗?

377628 次浏览

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

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

当服务器为 不是逃跑时,必须复制数据库。

首先应该停止 mysql 服务器。

# /etc/init.d/mysql stop

之后,您应该将旧的数据目录(例如/var/lib/mysql) inc. 特权复制到您的新目录

# cp -R -p /var/lib/mysql /new/data/dir

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

# /etc/init.d/mysql restart
  1. 使用以下命令停止 MySQL:

    sudo /etc/init.d/mysql stop
    
  2. Copy the existing data directory (default located in /var/lib/mysql) using the following command:

    sudo cp -R -p /var/lib/mysql /newpath
    
  3. edit the MySQL configuration file with the following command:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
    
  4. Look for the entry for datadir, and change the path (which should be /var/lib/mysql) to the new data directory.

  5. In the terminal, enter the command:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
    
  6. Look for lines beginning with /var/lib/mysql. Change /var/lib/mysql in the lines with the new path.

  7. Save and close the file.

  8. Restart the AppArmor profiles with the command:

    sudo /etc/init.d/apparmor reload
    
  9. Restart MySQL with the command:

    sudo /etc/init.d/mysql restart
    
  10. Now login to MySQL and you can access the same databases you had before.

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

如果你在一台 Mac 电脑上,并且使用 Homebrew 安装了 MySQL,那么这个应该对你有用。否则,您只需要替换机器上 MySQLdatadir的适当位置。

#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

你又开始使用本地数据库了,希望这对你有帮助。

第一站 mysqld

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

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

备注:
# 1: 可能你必须调整你的 SELinux 设置(在遇到麻烦时禁用 SELinux) ,Apparmor (Ubuntu)也可能是个问题。

# 2: 参见 安装数据库引用

如果您正在使用 SE linux,请通过编辑/etc/selinux/config 将其设置为允许模式 还在改变 SELINUX = 强制执行到 SELINUX = 许可

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

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

配置文件可能出现在

/etc/mysql/my.cnf

数据文件可能出现在

/var/lib/mysql

你应该做的是

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

然后任务就完成了。

但是如果您没有使用 apt 或 yum 安装它,那么目录可能不喜欢这样做 ,可以找到 mysql 文件

Mysql 在哪

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

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

这个解决方案可以在 Windows7中使用 Workbench。您需要具有管理员权限才能执行此操作。它创建一个连接(比如一个快捷方式)到您真正想要存储数据的地方

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

https://bitsum.com/junctionmaster.php安装 JunctionMaster

导航到 C: ProgramData MySQL MySQL Server 5.6

右键点击数据并选择“移动,然后链接文件夹到...” 接受警告 将目的地指向“您的新数据目录这里没有引号” 点击移动和链接

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

右键点击 Data 打开安全标签 单击“编辑” 单击“添加” 键入网络服务,然后检查名称 单击 OK 单击“允许完全控制”复选框,然后单击“确定”

回到 Workbench 并启动服务器

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

@ user1341296所说的一切,还有..。

你最好不要改变 /etc/mysql/my.cnf 相反,您需要创建新的 file/etc/mysql/conf.d/ext.cnf(任何名称,但扩展名应该是 cnf)

把你的零钱放进去:

[mysqld]
datadir=/vagrant/mq/mysql

用这种方式

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

首先停止你的 mysql

sudo service mysql stop

将 mysql 数据复制到新位置。

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

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

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的信息,优化 这里

我们必须将 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

在 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

但我怀疑这也没有必要。

如果你想通过编程的方式(不使用 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/

简单快捷:

# 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

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

我遵循下面的步骤来更改数据目录,效果非常好。 在 Linux 中更改 mysql 数据目录

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

在解决问题之前先说点废话:

MySQL 使用 Data 目录存储您创建的不同数据库的数据。最后,它必须以文件的形式存储它们,并在应用程序和文件格式中添加一些技巧,以确保您在 Database 类中学到的 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 : 查找当前的 Data 目录

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

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

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

在编辑器中打开它(记事本 + + 可能)。

使用 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:\.Launch 命令提示符(Window + R,cmd,Enter)

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

并将复制的文件夹重命名为您更改的新 datadir

为什么不简单地复制?因为这一点都不酷!,这有助于您不失去对复制文件夹的权限,这样当您重新启动 MySQL80时,它就不会出现愚蠢的错误: “本地计算机上的 MySQL80服务启动后停止。一些服务如果没有被其他服务或程序使用就会自动停止。”- 感谢: 微软

步骤4 : 重新启动服务

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

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

如果你像我一样使用 debian,你想把 mysql dir 移动到你的 home 或者/home/... ,解决方案是:

  • 通过“ sudo service mysql Stop”停止 mysql
  • 将“ datadir”变量更改为“/etc/mysql/mariadb.con.d/50-server. cnf”中的新路径
  • 执行/var/lib/mysql 的备份: “ cp-R-p/var/lib/mysql/path _ to _ my _ back”
  • 删除这个目录: “ sudo rm-R/var/lib/mysql”
  • 将数据移动到新的 dir: “ cp-R-p/path _ to _ my _ back/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 文档的解决方案。 希望这对大家有帮助!

上面的步骤是基础和基本的,我照着做了,还是出现了“ mysql 启动失败”的错误。

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

除此之外,它还需要检查 mysql 的父目录的权限和所有权(如果有/data/mysql/)。这里的/data/目录应该是 root: root。在更改/mysql 的父目录的所有权之后,我修正了“ mysql 未能启动”的错误。 我的虚拟机的操作系统是 RHEL 7.6。

也可以对 datadir 进行符号链接。

(自酿的)例如。

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

除了已接受的答案之外,如果希望在 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。这里一个重要的细节是,=左边的字符是一个制表符,而右边的字符是一个空格。我花了点时间才弄明白。

我按照@sMyles 的指南,但是没能再次启动 mysqld。我们为什么不建立一个软链接来改变数据库呢?

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

我可以成功地更改 MySQLMariaDB的数据目录,并解决 软呢帽30上的所有相关问题。我认为下面的步骤将对其他发行版起作用。

注意: 像 Ubuntu这样的 Debian-based发行版的用户应该搜索如何禁用和编辑 AppArmor,然后遵循以下步骤。

禁用 SELinux

首先,让我提到的 基于 RedHat 的 Linux 发行版(RHELs)喜欢 软呢帽森托斯等等。使用执行强制访问控制政策的 ABc5。所以最好在下面的步骤中对它进行 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(执行)权限。我不喜欢使用递归脚本,因此:

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 了。 干杯; -)

这对我和 MySQL8很有用

将文件传输到外部驱动器

sudo rsync -av /var/lib/mysql /datadrive

编辑 MySQL 配置

sudo nano /etc/mysql/my.cnf

添加行

[mysqld]
datadir = /datadrive/mysql
log_error = /datadrive/mysql/error.log

编辑装甲

sudo nano /etc/apparmor.d/tunables/alias

添加行

alias /var/lib/mysql/ -> /datadrive/mysql/,

重启 MySQL

sudo systemctl restart mysql

看看有没有用

sudo mysql
select @@datadir;

在尝试了许多解决方案之后,下面是对我有效的方法的总结(Ubuntu 22.04mysql server 8.0.29) :

  1. 完全卸载 < strong > mysql

    • sudo systemctl stop mysql
    • sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
    • sudo rm -r /etc/mysql /var/lib/mysql(小心谨慎: 这将删除所有现有的数据; 您可以在其他时候重命名这个目录)
    • sudo apt autoremove
    • sudo apt autoclean
  2. 重新安装 Mysql服务器和客户端

    • sudo apt update
    • sudo apt install mysql-server mysql-client
  3. 注意 Mysql datadir默认位置

    • (通常为: /var/lib/mysql)

[如果您已经挂载了新的 datadir 位置,请跳到步骤7,here/db ]

  1. 创建一个新目录(在这里我将使用 /分贝; db 代表数据库) ,用于将分区挂载到您想要定位 mysql datadir 的位置(在我的配置 /dev/sdb1中)

    • sudo mkdir /db
  2. 编辑 < strong >/etc/fstab

    • sudo nano /etc/fstab
    • 在文件末尾添加这一行:

    /dev/sdb1/db ext4默认为00

    • 保存和退出(Ctrl + x 和 y)
  3. 重启

    • sudo reboot
    • 重新启动后,检查 /dev/sdb1是否正确挂载在 < strong >/db 上 校对: df -h /db
  4. 移动数据库位置

    • 使 Mysql成为新的 datadir 位置的所有者: sudo chown mysql:mysql /db
    • Mysql 服务器: sudo systemctl stop mysql
    • 将默认数据目录 /var/lib/mysql(参见步骤3)的所有内容复制到新的数据目录 /分贝: sudo rsync -avzh /var/lib/mysql/ /db

现在应该将 /var/lib/mysql目录的所有内容复制到新目录 /分贝

performance_schema/table_lock_waits_109.sdi
performance_schema/threads_110.sdi
performance_schema/tls_channel_stat_190.sdi
performance_schema/user_defined_fun_188.sdi
performance_schema/user_variables_b_176.sdi
performance_schema/users_144.sdi
performance_schema/variables_by_thr_183.sdi
performance_schema/variables_info_186.sdi
sys/
sys/sys_config.ibd


sent 4.44M bytes  received 2.70K bytes  1.78M bytes/sec
total size is 182.35M  speedup is 41.09

/db 目录现在准备成为新的 Mysql数据目录。

  1. 配置 装甲以允许 /分贝成为 Mysql数据目录,方法是按照以下步骤编辑 AppArmaralias 文件 /etc/appmor.d/tunables/alias

    • sudo nano /etc/apparmor.d/tunables/alias
    • 在文件末尾添加这一行

    别名/var/lib/mysql->/db,

    • 保存和退出(Ctrl + x 和 y)
    • 重启 装甲: sudo systemctl restart apparmor
  2. 将 data 目录从 /var/lib/mysql更改为 < strong >/db

    • sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
    • 取消对代码行 #datadir = /var/lib/mysql的注释并将其更改为 datadir = /db
    • 保存和退出(Ctrl + x 和 y)
  3. 重新启动并连接到 < strong > mysql

    • sudo systemctl start mysql
    • sudo mysql -u root -p
    • 您现在应该登录 mysql
    • sql> select @@datadir;应该回来了
+-----------+
| @@datadir |
+-----------+
| /db/      |
+-----------+
1 row in set (0,00 sec)

就是这样!

感谢 Shahriar Shovon: 如何更改 Ubuntu 上的 MySQL/MariaDB 数据目录