重启服务器出现Can't find file: './mysql/plugin.frm' 和 Unknown table engine 'InnoDB'

本文记录了一次MySQL服务器无法启动的问题排查过程,通过调整文件权限和关闭防火墙最终解决了启动失败及未知表引擎InnoDB的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      日志分析的kettle跑批无故变慢,分析了多种情况后没有解决问题。决定重启服务器,重启服务器后,发现上面的mysql数据库启动不了,提示如下:  /usr/libexec/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)

110222 11:15:07 mysqld_safe Starting mysqld daemon with databases from /home/mysql
110222 11:15:07 [Warning] Can't create test file /home/mysql/localhost.lower-test
110222 11:15:07 [Warning] Can't create test file /home/mysql/localhost.lower-test
 /usr/libexec/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
110222 11:15:07 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
110222 11:15:07  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.
110222 11:15:07 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

 解决方法如下:

#在终端中先输入下面这一行

chown -R mysql:mysql /home/data/mysql
#在输入下面的一行就OK了

chcon -R -t mysqld_db_t /home/mysql

#重启下MYSQL试试~

 

     重启mysql是OK了,但是访问数据库表的时候提示:Unknown table engine 'InnoDB',用了网上各种方法,修改了my.cnf N次,都没有解决。最后把防火墙关闭了setenforce 0,数据能正常访问。

     百度了一下,还是没理解防火墙和innodb有什么关系?记录一下该问题,为后面遇见这种问题的提供一个解决方案。

 

<think>我们遇到了一个关于MySQL audit_log插件安装的问题:错误1126,无法打开共享库文件。根据提供的引用错误信息,我们可以将问题分为几个可能的原因解决方案。 错误信息示例: ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/audit_log.so' (errno: 2 ...) 可能的原因及解决方案: 1. **文件不存在**:确保插件文件`audit_log.so`确实存在于指定的路径。MySQL插件的默认路径通常是`/usr/lib/mysql/plugin/`或`/usr/local/mysql/lib/plugin/`,具体取决于安装方式。 解决方案:检查文件是否存在。 ```bash ls -l /usr/local/mysql/lib/plugin/audit_log.so ``` 如果不存在,可能需要重新安装插件或从其他位置复制。 2. **文件权限问题**:即使文件存在,MySQL进程(通常是`mysql`用户)也可能没有读取权限。 解决方案:检查文件权限并修改。 ```bash # 查看权限 ls -l /usr/local/mysql/lib/plugin/audit_log.so # 修改权限(确保mysql用户有读取权限) chmod 755 /usr/local/mysql/lib/plugin/audit_log.so chown mysql:mysql /usr/local/mysql/lib/plugin/audit_log.so # 如果文件所属用户不正确 ``` 3. **SELinux限制**:如果系统启用了SELinux,它可能会阻止MySQL进程访问插件文件。 解决方案:临时禁用SELinux或添加策略规则。 - 临时禁用(重启后失效): ```bash setenforce 0 ``` - 永久禁用(修改配置文件`/etc/selinux/config`,设置`SELINUX=disabled`,然后重启) - 或者添加策略规则(推荐): ```bash # 使用audit2allow生成策略模块 grep mysql /var/log/audit/audit.log | audit2allow -M mysql_plugin semodule -i mysql_plugin.pp ``` 4. **AppArmor限制**(Ubuntu等系统):类似SELinux,AppArmor也可能限制MySQL访问。 解决方案:编辑AppArmor配置文件,添加路径权限。 - 编辑文件`/etc/apparmor.d/usr.sbin.mysqld`,在文件末尾添加: ``` /usr/local/mysql/lib/plugin/audit_log.so r, ``` - 重新加载AppArmor配置: ```bash sudo systemctl reload apparmor ``` 5. **插件目录路径错误**:MySQL可能没有在正确的路径中查找插件。可以通过以下命令查看MySQL的插件目录: ```sql SHOW VARIABLES LIKE 'plugin_dir'; ``` 确保`audit_log.so`文件位于该目录下。 6. **动态链接库路径问题**:如果插件依赖其他共享库,可能会因为找不到依赖而失败。使用`ldd`检查依赖: ```bash ldd /usr/local/mysql/lib/plugin/audit_log.so ``` 如果有缺失的依赖,安装相应的库。 7. **文件系统挂载选项**:如果插件目录所在的文件系统以`noexec`选项挂载,则无法执行共享库文件。检查挂载选项: ```bash mount | grep /usr/local/mysql ``` 如果包含`noexec`,需要重新挂载(例如,`mount -o remount,exec /usr/local/mysql`)或修改`/etc/fstab`永久移除`noexec`。 8. **插件与MySQL版本不兼容**:确保插件文件是为当前MySQL版本编译的。尝试从MySQL官方下载对应版本的插件。 9. **插件目录不在动态链接器的搜索路径中**:参考引用[4]的解决方案,将插件目录添加到动态链接库的配置中。 - 创建或编辑文件`/etc/ld.so.conf.d/mysql.conf`,添加插件目录: ```bash echo "/usr/local/mysql/lib/plugin" > /etc/ld.so.conf.d/mysql.conf ``` - 更新动态链接库缓存: ```bash ldconfig ``` 10. **其他可能**:如果以上都不行,尝试重启MySQL服务。 步骤总结: 1. 确认插件文件存在且路径正确(与`plugin_dir`一致)。 2. 检查文件权限所有权(确保mysql用户可读)。 3. 检查SELinux/AppArmor。 4. 检查动态链接库依赖(ldd)。 5. 检查文件系统挂载选项(noexec)。 6. 将插件目录加入动态链接库配置(ld.so.conf)并运行ldconfig。 7. 重启MySQL服务。 如果问题仍然存在,请提供更多环境信息(如操作系统、MySQL版本、安装方式等)以便进一步排查。 §§ 相关问题 §§ 1. 如何查看MySQL的插件目录? 2. 如何为MySQL安装第三方插件? 3. 如何解决SELinux导致的MySQL权限问题? 4. 如何检查共享库文件的依赖关系?</think>### 解决 MySQL audit_log 插件错误 1126 (共享库无法打开) #### 错误原因分析 错误 `ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/audit_log.so'` 通常由以下原因导致: 1. **文件不存在**:插件文件未正确安装或路径错误 2. **权限不足**:MySQL 进程用户(如 `mysql`)无权访问文件 3. **动态链接库路径未配置**:系统未识别插件路径 4. **SELinux/AppArmor 限制**:安全策略阻止访问 --- #### 逐步解决方案 ##### 步骤 1:验证插件文件是否存在 ```bash # 检查文件是否存在 ls -l /usr/local/mysql/lib/plugin/audit_log.so # 若不存在,重新安装插件(需下载对应版本) wget https://downloads.mysql.com/archives/get/p/30/file/audit_log-1.0.10-1.el7.x86_64.rpm rpm2cpio audit_log-*.rpm | cpio -idv cp usr/lib64/mysql/plugin/audit_log.so /usr/local/mysql/lib/plugin/ ``` ##### 步骤 2:修复文件权限 ```bash # 修改文件所有者为 mysql 用户 chown mysql:mysql /usr/local/mysql/lib/plugin/audit_log.so # 设置读写权限 chmod 755 /usr/local/mysql/lib/plugin/audit_log.so # 验证权限 ls -l /usr/local/mysql/lib/plugin/ | grep audit_log.so ``` > 输出应类似:`-rwxr-xr-x 1 mysql mysql ... audit_log.so` [^1] ##### 步骤 3:配置动态链接库路径 ```bash # 创建配置文件 echo "/usr/local/mysql/lib/plugin" > /etc/ld.so.conf.d/mysql_plugin.conf # 更新动态链接器缓存 ldconfig # 验证路径是否生效 ldconfig -v | grep mysql ``` > 输出应包含 `/usr/local/mysql/lib/plugin` [^4] ##### 步骤 4:禁用安全策略(临时测试) ```bash # 临时禁用 SELinux setenforce 0 # 临时禁用 AppArmor systemctl stop apparmor ``` > 若此步骤解决问题,需永久配置策略: > ```bash > # SELinux 永久允许 > semanage fcontext -a -t lib_t "/usr/local/mysql/lib/plugin/audit_log.so" > restorecon -v /usr/local/mysql/lib/plugin/audit_log.so > ``` ##### 步骤 5:加载插件并验证 ```sql -- 加载插件 INSTALL PLUGIN audit_log SONAME 'audit_log.so'; -- 检查状态 SHOW PLUGINS; ``` > 成功输出示例: > | Name | Status | > |------------|--------| > | audit_log | ACTIVE | --- #### 完整配置示例(my.cnf) ```ini [mysqld] # 插件路径 plugin_dir = /usr/local/mysql/lib/plugin # 审计插件配置 plugin-load-add = audit_log.so audit_log = FORCE_PLUS_PERMANENT audit_log_policy = ALL audit_log_file = /var/log/mysql_audit.log ``` #### 关键验证命令 ```bash # 检查 MySQL 错误日志 tail -f /var/log/mysqld.log # 检查内核安全日志 (SELinux) grep mysql /var/log/audit/audit.log | grep denied ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值