mysql数据迁移不生效_mysql 数据库位置迁移踩坑笔记

花费不少力气,把mysql 运行的坑全踩完了。

踩坑过程中,最大的难题是mysql 报错信息不可信。 本身是innoDB缺文件的问题,在journalctl -xe日志里会被记录成apparmor的问题。

下面是趟完搞定的步骤

1. 关闭apparmor, 有一个命令

Start : sudo /etc/init.d/apparmor start

Stop : sudo /etc/init.d/apparmor stop

reload: sudo /etc/init.d/apparmor reload

Show status: sudo /etc/init.d/apparmor status

用这4个确保apparmor关掉

2. 修改数据库目录位置。先敲 mysql --help 可以看见mysql 的conf文件读取顺序。 mysql的配置文件conf 可以有很多个,互相之间能引用,能覆盖,需要按help 里面按顺序一个个找。

修改mysql 的data文件夹到指定位置,具体办法网上很多就不写了

3. sudo mysqld --initialize, 重新初始化mysql。 注意,定义的新数据库文件夹需要全空,权限也得打开。 这里的报错信息是可信的,没什么坑

4. 在conf里面 加入一行skip-grant-tables 屏蔽掉 密码。

直接用SET PASSWORD FOR root@'localhost' = PASSWORD('123');修改密码, 会出现 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 。 这个报错也是误导性的......

FLUSH PRIVILEGES; 即可处理掉。。

之后 SET PASSWORD FOR root@'localhost' = PASSWORD('123'); 重新设置root密码。

5 一切正常后就正常配置普通用户账号密码

root 进 mysql

create user xxx

set PASSWORD for xxx = PASSWORD('yyy')

grant all privileges on *.* to xxx;

6. 迁移旧数据时,需要把数据库对应的文件夹,以及ib 开头的几个文件全拷过来。

此时一旦拷贝不完全,会出现mysql 无法启动的问题。 journalctl -xe 看日志会给出apparmor 拒绝的问题。 也是误导性debug提示。

解决办法是看error.log日志,日志在 /var/log/mysql/error.log 里, 用tail -n 100 /var/log/mysql/error.log 查看日志能找到出错原因。

补充 mysql 8.0

之前的步骤在ubuntu16.04+mysql 8.0 中仍然会报错,会卡在 sudo mysqld --initialize 这里,报错permission denied 。 查询后是selinx+apparmor+权限的问题。

额外步骤 1. apt install selinux-utils, 然后setenforce 0。

2. apparmor 卸了(sudo apt remove apparmor) 同时以防万一 按照网上步骤在apparmor 配置中添加了mysql 新data目录的权限

此时需要立刻重启电脑。

之后sudo mysqld --initialize 应该就通过了。 命令运行完毕的同时会生成新root密码。

3 . 即便完成上述两步骤, service mysql start 仍然会打不开。 此时需要改一下mysqld --initialize 创建的目录的权限。 chown -R mysql:mysql 目标目录。 之后一切正常。

注: 改密码也是个坑, mysql 8.0中默认密码隐藏在/etc/logs/mysql/error.log 里, 登陆后首次修改必须得用这个命令,ALTER USER 'root'@'localhost' IDENTIFIED BY '123'; 。 修改账户表的办法会显示第一次登录请用alter user 修改密码弹错。

你可能感兴趣的:(mysql数据迁移不生效)