将数据移动到外部硬盘后,我无法启动 mysql。
我的设置(Raspbian):
- 默认 MySQL 数据文件夹:/var/lib/mysql
- 目标 MySQL 数据文件夹:/media/exthdd/mysql_data
以下是我尝试重新定位 mysql 数据的方法:
sudo service mysql stop
sudo mkdir /media/exthdd/mysql_data
sudo cp -adR /var/lib/mysql/ /media/exthdd/mysql_data
sudo chown mysql:mysql -R /media/exthdd/mysql_data
sudo chmod 771 -R /media/exthdd/mysql_data/
sudo nano /etc/mysql/my.cnf
datadir = /media/exthdd/mysql_data
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
所以现在我有两个选择:
- 允许所有用户访问 exthdd (chmod 777)
- 将 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 非常有帮助,我接受了他的回答)