确定MySQL数据库文件位置
MySQL 命令
show variables like '%dir%';
注:用Ubuntu的apt包管理工具安装的mysql数据库,默认将数据库文件保存在/var/lib/mysql目录下
停止服务
sudo /etc/init.d/mysql stop
或者
service mysql stop
拷贝文件
sudo cp -a /var/lib/mysql /mnt/data/
注:使用cp复制命令将原数据库目录文件复制到新的目录,好处是。。万一迁移失败,恢复工作相对简单一点,等确认迁移成功再来删掉原数据库目录文件也不迟。为了不影响复制过来数据库目录文件权限和用户用户组归属问题,使用cp命令时要加上-a参数
关键步骤
修改配置文件
一共需要改3个文件 需要root权限
第一个 my.cnf文件
vim /etc/mysql/my.cnf
将其中[mysqld]标签下的datadir属性值改为新数据库目录路径如:/data/mysql
第二个 usr.bin.mysqld文件
vim /etc/apparmor.d/usr.sbin.mysqld
找到其中的
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
两行权限声明,可以在前面加上#好注释掉。然后对照格式,加入新路径的权限声明:
/data/mysql/ r,
/data/mysql/** rwk,
第三个 abstractions/mysql文件
vim /etc/apparmor.d/abstractions/mysql
同样也是将新数据库文件路径中的socket文件权限添加进去,同时可以删除或者注释掉全路径中申请的权限,效果如下
# ------------------------------------------------------------------
#
# Copyright (C) 2002-2006 Novell/SUSE
# Copyright (C) 2013 Christian Boltz
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
# License published by the Free Software Foundation.
#
# --------------------------------------------------------
#/var/lib/mysql/mysql.sock rw,
/data/mysql/mysql.sock rw, #照猫画虎 自己的路径
/{var/,}run/mysql/mysql.sock rw,
/usr/share/{mysql,mysql-community-server,mariadb}/charsets/ r,
/usr/share/{mysql,mysql-community-server,mariadb}/charsets/*.xml r,
最后别忘了重启一下服务
配置文件修改成功后就可以重启数据库,重启数据库之前需要先重新载入apparmor配置文件,使用下面命令重新载入:
sudo /etc/init.d/apparmor restart
重载成功就可以使用下面命令启动数据库:
sudo /etc/init.d/mysql start
关于启动失败
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
的问题 参考此篇文章
话说不会偷懒的程序员不是好程序员,因为有N多台机器要我改,不可能一个一个来搞,那会蠢死去。所以研究了一下 弄了个测试脚本共享一下也方便有需要的童鞋。PS:改之前千万记得备份。备份真的是个好习惯
/etc/init.d/mysql stop;
sudo cp -a /var/lib/mysql /data/; #成功之后可以删掉原目录的文件
sed -i '42s?/var/lib?/data?' /etc/mysql/my.cnf;
sed -i '32s?/var/lib?/data?' /etc/apparmor.d/usr.sbin.mysqld;
sed -i '33s?/var/lib?/data?' /etc/apparmor.d/usr.sbin.mysqld;
sed -i '12s?/var/lib?/data?' /etc/apparmor.d/abstractions/mysql;
/etc/init.d/apparmor restart;
/etc/init.d/mysql start;
service mysql restart #为了生效,保险起见 还是再重启一下服务 强迫症