无法将 MySQL 数据移动到外部驱动器

无法将 MySQL 数据移动到外部驱动器

将数据移动到外部硬盘后,我无法启动 mysql。

我的设置(Raspbian):

  • 默认 MySQL 数据文件夹:/var/lib/mysql
  • 目标 MySQL 数据文件夹:/media/exthdd/mysql_data

以下是我尝试重新定位 mysql 数据的方法:

  1. sudo service mysql stop
  2. sudo mkdir /media/exthdd/mysql_data
  3. sudo cp -adR /var/lib/mysql/ /media/exthdd/mysql_data
  4. sudo chown mysql:mysql -R /media/exthdd/mysql_data
  5. sudo chmod 771 -R /media/exthdd/mysql_data/
  6. sudo nano /etc/mysql/my.cnf
  7. datadir = /media/exthdd/mysql_data
  8. sudo service mysql start

这是我后来得到的错误:

mysql.service 作业失败。请参阅“systemctl status mysql.service”和“journalctl -xn”了解详情。

运行journalctl -xn我得到:

未找到日志文件。

为了systemctl status mysql.service

mysql.service - LSB:启动和停止 mysql 数据库服务器守护进程

已加载:已加载(/etc/init.d/mysql)

活动:失败(结果:退出代码)自 2016-08-20 星期六 18:58:48 CST;2 分钟 4 秒前

进程:27436 ExecStop=/etc/init.d/mysql stop(代码=exited,状态=0/SUCCESS)

进程:373 ExecStart=/etc/init.d/mysql start(代码=exited,状态=1/FAILURE)

错误日志sudo cat /var/log/mysql/error.log中有以下内容:

160820 19:05:50 mysqld_safe 使用来自 /media/exthdd/mysql_data 的数据库启动 mysqld 守护进程

160820 19:05:50 [警告] 使用唯一选项前缀 key_buffer 代替 key_buffer_size 的做法已被弃用,并将在将来的版本中被删除。请使用全名。

160820 19:05:50 [注意] /usr/sbin/mysqld (mysqld 5.5.49-0+deb8u1) 作为进程 2403 启动...

160820 19:05:50 [警告] 使用唯一选项前缀 myisam-recover 代替 myisam-recover-options 已被弃用,并将在将来的版本中删除。请使用全名。

160820 19:05:50 [注意] 插件“FEDERATED”已禁用。/usr/sbin/mysqld:表“mysql.plugin”不存在

160820 19:05:50 [错误] 无法打开 mysql.plugin 表。请运行 mysql_upgrade 来创建它。

160820 19:05:50 InnoDB:InnoDB 内存堆已禁用

160820 19:05:50 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数

160820 19:05:50 InnoDB:压缩表使用 zlib 1.2.8

160820 19:05:50 InnoDB:使用 Linux 原生 AIO

160820 19:05:50 InnoDB:初始化缓冲池,大小 = 128.0M

160820 19:05:50 InnoDB:缓冲池初始化完成

160820 19:05:50 InnoDB:支持的最高文件格式是 Barracuda。InnoDB:日志扫描已超过检查点 lsn 49439

160820 19:05:50 InnoDB:数据库未正常关闭!InnoDB:开始崩溃恢复。InnoDB:从 .ibd 文件读取表空间信息...InnoDB:从 doublewrite 恢复可能半写的数据页 InnoDB:缓冲区...InnoDB:正在进行恢复:扫描到日志序列号 1595675

160820 19:05:51 InnoDB:开始将一批日志记录应用到数据库...InnoDB:进度百分比:45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 InnoDB:应用批次已完成

160820 19:05:51 InnoDB:等待后台线程启动

160820 19:05:52 InnoDB:5.5.49 已启动;日志序列号 1595675

160820 19:05:52 [注意] 服务器主机名(绑定地址):'127.0.0.1';端口:3306

160820 19:05:52 [注意] - '127.0.0.1' 解析为 '127.0.0.1';

160820 19:05:52 [注意] 在 IP '127.0.0.1' 上创建服务器套接字。

160820 19:05:52 [错误] 致命错误:无法打开和锁定特权表:表“mysql.host”不存在

160820 19:05:52 mysqld_safe mysqld 来自 pid 文件 /var/run/mysqld/mysqld.pid 结束

[更新] 我已将 mysql 更新至 5.6.30-1,但问题仍然存在(尽管现在错误有所不同)。另外,不要混淆,我创建了一个从 /var/lib/mysql -> /media/exthdd/mysql 的符号链接

orangepi@OrangePI:/var/lib/mysql$ sudo service mysql start orangepi@OrangePI:/var/lib/mysql$ sudo service mysql status

● mysql.service - MySQL 社区服务器

已加载:已加载(/lib/systemd/system/mysql.service;已启用)

活跃:自 2016-08-22 星期一 03:55:30 CST 以来 40 秒前处于不活跃状态(已死亡)

进程:8151 ExecStartPost=/usr/share/mysql/mysql-systemd-start post >(代码=exited,状态=0/SUCCESS)

进程:8150 ExecStart=/usr/bin/mysqld_safe(代码=退出,状态=0/成功)

进程:8148 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre >(代码=exited,状态=0/SUCCESS)主 PID:8150(代码=exited,状态=0/SUCCESS)

8 月 22 日 03:55:00 OrangePI mysqld_safe[8150]: 160822 03:55:00 mysqld_safe 无法同时记录到错误日志和系统日志。删除所有 --log-error 配置...即可生效。

8 月 22 日 03:55:00 OrangePI mysqld_safe[8150]: 160822 03:55:00 mysqld_safe 记录到‘/var/log/mysql/error.log’。

8 月 22 日 03:55:00 OrangePI mysqld_safe[8150]: 160822 03:55:00 mysqld_safe 使用 /var/lib/mysql 中的数据库启动 mysqld 守护进程

8 月 22 日 03:55:00 OrangePI mysqld_safe[8150]: 160822 03:55:00 mysqld_safe mysqld 从 pid 文件 /var/run/mysqld/mysqld.pid 结束

8 月 22 日 03:55:30 OrangePI systemd[1]: 已启动 MySQL 社区服务器。提示:有些行被省略,请使用 -l 完整显示。

再次出现错误日志:

orangepi@OrangePI:/var/lib/mysql$ sudo cat /var/log/mysql/error.log

160822 03:55:00 mysqld_safe 使用来自 /var/lib/mysql 的数据库启动 mysqld 守护进程

2016-08-22 03:55:00 0 [警告] 使用唯一选项前缀 key_buffer 代替 key_buffer_size 的做法已被弃用,并将在将来的版本中删除。请使用全名。

2016-08-22 03:55:00 0 [警告] 带有隐式 DEFAULT 值的 TIMESTAMP 已弃用。请使用 --explicit_defaults_for_timestamp 服务器选项(有关更多详细信息,请参阅文档)。

2016-08-22 03:55:00 0 [注意] /usr/sbin/mysqld (mysqld 5.6.30-1) 作为进程 8516 启动...

2016-08-22 03:55:00 8516 [警告] 无法创建测试文件 /var/lib/mysql/OrangePI.lower-test

2016-08-22 03:55:00 8516 [警告] 无法创建测试文件 /var/lib/mysql/OrangePI.lower-test /usr/sbin/mysqld: 无法将目录更改为 '/var/lib/mysql/' (错误代码:13 - 权限被拒绝)

2016-08-22 03:55:00 8516 [错误] 正在中止

2016-08-22 03:55:00 8516 [注释] Binlog结束

2016-08-22 03:55:00 8516 [注意] /usr/sbin/mysqld: 关闭完成

160822 03:55:00 mysqld_safe mysqld 来自 pid 文件 /var/run/mysqld/mysqld.pid 结束

它说它无法创建测试文件,但 mysql 确实拥有所有权限并拥有所有 mysql 文件夹/文件。

答案1

您的问题是主 mysql 数据库中的 mysql 表丢失或损坏。更可能是它没有复制过来。有问题的表是 mysql.host

因此,首先,确保/var/lib/mysql复制了每个文件,特别是不属于您创建的数据库的文件和目录。由于您使用的是旧版本的 MySQL 5.5.49。我建议将您的服务器更新为更稳定的版本。当前最新的稳定版本是 5.7.14

5.6.7 及以上版本不再使用此表,因此如果您升级到此版本或更高版本,您只需使用mysql_upgrade命令来升级您的数据库,它就会使您的服务器恢复正常工作。

但是,如果出于某种原因您必须使用 MySQL 5.5 版本,那么可以使用 MySQL 5.5.51,它是 5.5 分支的最后一个稳定版本。您可以尝试几个选项。您可以使用它mysql_install_db来尝试重新创建 MySQL 数据库。或者,如果这不起作用,您将不得不删除 MySQL 数据库,然后重新安装服务器以使其重新生成这些表。

需要明确的是,我指的数据库是 MySQL 的主数据库,它保存有关服务器以及用户等的信息。而不是您创建的数据库。

答案2

解决了!

这不是 apparmor (SELinux,也不是 的权限/temp这是我的外部硬盘的父文件夹的权限

因此,为了让未来的读者清楚:

我想将 mysql 数据从 移动/var/lib/mysql/media/exthdd/mysql_data

移动数据后,我正确设置了文件夹mysql的权限mysql_data

drwxrwx--- 7 mysql mysql 4096 8月22日 20:52 mysql_data

但父文件夹的/media/exthdd权限被排除mysql

drwxrwx--- 4 orangepi www-data 4096 八月 22 20:28 owncloud

所以现在我有两个选择:

  1. 允许所有用户访问 exthdd (chmod 777)
  2. 将 mysql 添加到 www-data 组(www-data 组拥有该目录)

我选择了第二种选择:

sudo usermod -a -G www-data mysql

然后!

sudo service mysql start

sudo service mysql status

mysql.service——MySQL 社区服务器

已加载:已加载(/lib/systemd/system/mysql.service;已启用)

活跃:自 2016-08-22 星期一 21:03:52 CST;3 秒前开始活跃(运行)

(由于@Frostalf 非常有帮助,我接受了他的回答)

相关内容