如何移动 MySQL 数据目录?

Jon*_*ers 62 mysql

我试图将我的 MySQL 数据库的数据目录移动到我作为安装点的第二个磁盘阵列/array2/

我遇到的问题是我已经尝试了所有方法,在我修改 my.cnf 中 datadir 的位置后,mysql 将无法再次启动。

我得到的是:

start: Job failed to start
Run Code Online (Sandbox Code Playgroud)

Jon*_*ers 65

忘记了应用程序装甲。

对于任何感兴趣的人,我执行了以下操作来移动文件夹。

停止mysql服务器:

stop mysql
Run Code Online (Sandbox Code Playgroud)

创建新目录:

mkdir /array2/mysql
Run Code Online (Sandbox Code Playgroud)

仅复制数据库文件夹:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql
Run Code Online (Sandbox Code Playgroud)

备份my.cnf文件:

cp /etc/mysql/my.cnf /root/my.cnf.backup
Run Code Online (Sandbox Code Playgroud)

编辑my.cnf文件:

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

将旧数据目录和套接字的所有提及更改为您的新位置

我的变成了:

datadir=/array2/mysql
Run Code Online (Sandbox Code Playgroud)
socket=/array2/mysql/mysql.sock
Run Code Online (Sandbox Code Playgroud)

更新目录权限:

chown -R mysql:mysql /array2/mysql
Run Code Online (Sandbox Code Playgroud)

重命名旧目录:

mv /var/lib/mysql /var/lib/mysql-old
Run Code Online (Sandbox Code Playgroud)

创建一个符号链接,以防万一:

ln -s /array2/mysql /var/lib/mysql 
Run Code Online (Sandbox Code Playgroud)

让 AppArmor 了解新的数据目录:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias
Run Code Online (Sandbox Code Playgroud)

重新加载 apparmor 配置文件

sudo /etc/init.d/apparmor reload
Run Code Online (Sandbox Code Playgroud)

然后启动mysql:

start mysql
Run Code Online (Sandbox Code Playgroud)

  • 如果不想每次mysql收到更新都麻烦合并`/etc/apparmor.d/usr.sbin.mysqld`,可以将`/array2/mysql/** rwk,`添加到`/etc /apparmor.d/local/usr.sbin.mysqld` 代替。Mysql 仍然可以访问旧的数据目录,但这可能不是问题。 (2认同)

小智 23

通过检查syslog,我发现 AppArmor 是罪魁祸首,并且能够mysql通过遵循此过程成功更改数据位置。

请注意,在下面编辑的文件中,+添加了以 开头的行,-并删除了以开头的行。+在向这些文件添加行时,您实际上不应键入/粘贴符号。

我将mysql目录克隆到新位置:

sudo rsync -av /var/lib/mysql /new_dir
Run Code Online (Sandbox Code Playgroud)

然后我编辑了datadir以下行/etc/mysql/my.cnf

sudo vi /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql
Run Code Online (Sandbox Code Playgroud)

然后我编辑/etc/apparmor.d/usr.sbin.mysqld

sudo vi /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,
Run Code Online (Sandbox Code Playgroud)

然后我重新启动mysql


小智 13

意识到。

如果您有 InnoDB 表,您必须复制ibdata*ib_logfile*文件,否则您将无法使用这些表。你会得到:

'表'databaseName.tableName' 不存在'

错误。

运行此复制命令以复制ibdata*ib_logfile*文件。

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
Run Code Online (Sandbox Code Playgroud)


sna*_*pop 7

我只是尝试了另一种方法,有些人可能会觉得有用:

复制权限不变:

rsync -avzh /var/lib/mysql /path/to/new/place
Run Code Online (Sandbox Code Playgroud)

备份(以防万一):

mv /var/lib/mysql /var/lib/_mysql
Run Code Online (Sandbox Code Playgroud)

创建一个新的空目录代替旧目录:

mkdir /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

将新位置绑定安装到旧位置:

mount -B /path/to/new/place /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

希望对某人有所帮助,因为符号链接对我不起作用,这是最简单的方法


Pos*_*aga 7

我更喜欢将 mount 与 bind 选项一起使用,这样我就可以避免在 Apparmor 和 Mysql 配置中进行任何进一步的更改。


例如:

假设我想将所有内容移入/var/www. 假设这个目录是我的开发环境,它安装在不同的分区中

  1. 首先我们需要停止 mysql

    sudo systemctl stop mysql.service
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我们移动文件(保留权限)

    sudo rsync -av /var/lib/mysql /var/www
    
    Run Code Online (Sandbox Code Playgroud)

    这将生成一个/var/www/mysql/包含所有内容的目录。

  3. 我们删除旧目录中的所有内容:

    sudo rm -r /var/lib/mysql/*
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我们使用旧目录中的bind选项挂载新目录。
    编辑/etc/fstab并添加这一行:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    
    Run Code Online (Sandbox Code Playgroud)

    这将挂载/var/www/mysql在我们的空目录中此处/var/lib/mysql
    bind选项会发挥作用,它将填充mysql 和 apparmor/var/lib/mysql/var/www/mysqlso内容,就像什么都没有改变一样。

  5. 现在我们进行挂载:

    sudo mount -a
    
    Run Code Online (Sandbox Code Playgroud)

    并重新启动mysql。