喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

MySQL常见问题

本文记录了 MySQL 常见的问题 以及解决方案

  • 数据库迁移目录

    • 关闭数据库 service mysqld stop
    • 修改 /etc/my.cnf 文件
      • datadir=/var/lib/mysql 改为 datadir=/home/lib/mysql
      • log-error=/home/log/mysqld.log 改为 log-error=/var/log/mysqld.log
    • 迁移数据
      • 执行 mkdir -p /home/log && touch /home/log/mysqld.log && chown mysql:mysql /home/log -R
      • 执行 mkdir -p /home/lib && mv /var/lib/mysql /home/lib/mysql && ln -s /home/lib/mysql /var/lib/mysql && chown mysql:mysql /home/lib/mysql
    • 关闭权限效验 setenforce 0
    • 启动数据库 service mysqld start
  • 迁移数据库目录之后 启动报错 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

    • 重新初始化数据库 mysqld --initialize --user=mysql --datadir=/home/lib/mysql
    • 如果提示命令不存在 可以试试 mysqld_safe

      注意 此命令会导致数据库数据丢失 记得备份

  • 迁移数据库目录之后 提示没有权限的问题处理

    • 第一种 提示没有权限 [Warning] Can't create test file /data/mysql/xxxxxx.lower-test
      • 请先检查 /data/mysql 的所有者是不是 mysql:mysql
    • 第二种 权限没有任何问题 但是还是提示没权限 请根据不同的操作系统执行下列操作
      • CentOs 等装有 SELINUX 的系统
        • 方案一 执行 setenforce 0 命令 暂时关闭
        • 方案二 /etc/selinux/config 修改这个文件 设置 SELINUX=disabled
      • Ubuntu 等没有 /etc/selinux/config 文件 但是有 /etc/apparmor.d/usr.sbin.mysqld 这个文件的
        • 打开 然后找到
          1
          2
          /var/lib/mysql/ r,
          /var/lib/mysql/** rwk,
        • 复制一份 改成
          1
          2
          /data/mysql/ r,
          /data/mysql/** rwk,
    • 第三种 你需要删除 ib_logfile* 在新的数据目录下执行 rm -rf ib_logfile*
  • 错误 Packet for query is too large (2164364 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

    • 解决方案: 增大最大包大小 set GLOBAL max_allowed_packet='3M';
    • 由于重启后会消失 所以 max_allowed_packet=3M 添加到 my.cnf 配置文件
  • 错误 Data source rejected establishment of connection, message from server: "Too many connections"

    • 解决方案: 增加最大连接数 set GLOBAL max_connections=2048;
    • 由于重启后会消失 所以 max_connections=2048 添加到 my.cnf 配置文件
  • 错误 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

    • 解决方案: 关闭效验 SET GLOBAL log_bin_trust_function_creators=1;
    • 由于重启后会消失 所以 log_bin_trust_function_creators=1 添加到 my.cnf 配置文件
  • 错误 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    • 解决方案: 关闭配置 关闭效验 SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
    • 由于重启后会消失 所以 sql_mode='NO_ENGINE_SUBSTITUTION' 添加到 my.cnf 配置文件

欢迎关注我的其它发布渠道