【问题标题】:lower_case_table_names Settings in MySQL 8.0.12MySQL 8.0.12 中的 lower_case_table_names 设置
【发布时间】:2019-01-19 01:20:09
【问题描述】:

我刚刚在 Ubuntu 16.0.4 中编译了 MySQL 8.0.12 版本。

按照网站上的说明制作如下my.cnf文件:

[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/localhost.localdomain.err
user=mysql
secure_file_priv=/usr/local/mysql/mysql-files
local_infile=OFF

log_error = /var/log/mysql/error.log

# Remove case sensitive in table names
lower_case_table_names=1

我收到以下错误:

2018-08-11T19:45:06.461585Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').

我应该进行哪些更改以使数据字典与服务器设置保持一致?

【问题讨论】:

标签: mysql lowercase data-dictionary


【解决方案1】:

到目前为止,我可以使用一种解决方法(我最初在 askubuntu 上发布):通过在安装后使用 lower_case_table_names 的新值重新初始化 MySQL。以下步骤适用于全新安装。如果数据库中已有数据,请先将其导出,然后再将其导入:

  1. 安装 MySQL:
    sudo apt-get update    
    sudo apt-get install mysql-server -y
    
  2. 停止 MySQL 服务:
    sudo service mysql stop
    
  3. 删除 MySQL 数据目录:
    sudo rm -rf /var/lib/mysql
    
  4. 重新创建 MySQL 数据目录(是的,仅删除其内容是不够的):
    sudo mkdir /var/lib/mysql    
    sudo chown mysql:mysql /var/lib/mysql
    sudo chmod 700 /var/lib/mysql
    
  5. 将lower_case_table_names = 1 添加到/etc/mysql/mysql.conf.d/mysqld.cnf 的[mysqld] 部分。
  6. 用--lower_case_table_names=1重新初始化MySQL:
    sudo mysqld --defaults-file=/etc/mysql/my.cnf --initialize --lower_case_table_names=1 --user=mysql --console
    
  7. 启动 MySQL 服务:
    sudo service mysql start
    
  8. 检索 MySQL 用户 root 新生成的密码:
    sudo grep 'temporary password' /var/log/mysql/error.log
    
  9. 通过以下方式更改 MySQL 用户 root 的密码:
    sudo mysql -u root -p
    
    并执行:
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPa$$w0rd';
    
    之后,或者通过调用“强化”脚本:
    sudo mysql_secure_installation
    

之后,您可以通过进入 MySQL shell 来验证 lower_case_table_names 设置:

sudo mysql -u root -p

并执行:

SHOW VARIABLES LIKE 'lower_case_%';

预期输出:

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 1     |
+------------------------+-------+

【讨论】:

  • 谢谢托马斯!这很有帮助。我建议在第 6 步和第 7 步之间再添加一个步骤,并为新创建的数据目录再运行一次:sudo chown mysql:mysql /var/lib/mysql
  • @DoyleB 为什么需要额外的步骤?没有它似乎运行良好。
  • 在我进行初始化之后,新文件被创建,但归根用户所有。当我尝试启动它时,它失败了,因为 mysql 用户没有权限。所需要的只是在 /var/lib/mysql 中修改文件。另外,在我上面的评论中,应该是 chown -R。以下是错误日志中的相关条目:[InnoDB] The innodb_system data file 'ibdata1' must be writable [InnoDB] The innodb_system data file 'ibdata1' must be writable [Server] Failed to initialize DD Storage Engine [Server] Data Dictionary initialization failed. [Server] Aborting
【解决方案2】:

防止这个问题的最好方法是:首先添加

[mysqld]
lower_case_table_names=1

然后第一次启动mysql服务。

但无论如何,如果你已经启动了服务器,来解决你的问题:

1.停止mysql:

systemctl stop  mysql

2.清理数据目录或更改默认值,以下是新安装的,如果您的数据库中有数据,请提前备份它们

rm -rf /var/lib/mysql

3.在你的 my.cnf 中插入 lower_case_table_names = 1:

[mysqld]
lower_case_table_names=1

4.重新开始

systemctl start mysqld

【讨论】:

  • 非常感谢它的工作,但我只添加,[mysqld] lower_case_table_names=1,因为 systemctl 命令不起作用。
  • 说明不完整。如果您删除 /var/lib/mysql 并且二进制文件消失了。你的第 4 步行不通。
【解决方案3】:

如果现在有人遇到这个问题,如果你已经初始化了mysql,这意味着你已经启动并运行了它,然后发生了这个错误,只需在my.ini文件中注释掉这一行。

lower_case_table_names=

【讨论】:

    【解决方案4】:

    为了解决这个问题,

    1. 只需在 bin 文件夹 (/usr/local/mysql/bin) 中使用以下命令备份现有 db Schema ./mysqldump -uroot -p 密码> dump.sql

    2. 备份完成后,使用以下命令删除 Mysql Home(/usr/local/mysql/) 中的现有数据文件夹 rm -rf 数据

    3. 现在在 MYSQLD 部分 (/etc/my.cnf) 下的 my.cnf 中添加配置为“lower_case_table_names=1”

    4. 现在在 bin 目录 (/usr/local/mysql/bin) 中使用以下命令初始化数据目录

    对于安全模式 ./mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --console

    对于不安全模式 ./mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql --console

    1. 数据目录初始化后,对于不安全模式再次重复安装,对于安全模式使用在数据运行时初始化的root密码目录初始化。

    2. 现在使用 (/usr/local/mysql/bin) 目录中的命令将现有转储文件导入 Mysql Server 中

    ./mysql -uroot -p 密码

    【讨论】:

      【解决方案5】:

      MySQL 文档说

      lower_case_table_names 只能在初始化服务器时配置。 禁止在服务器初始化后更改 lower_case_table_names 设置。

      https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html

      【讨论】:

      • 好的,但是如何初始化呢?
      【解决方案6】:

      根据link,lower_case_table_names 应该与 --initialize 选项一起设置。

      【讨论】:

      • 非常感谢。我应该想到这一点,但我在任何地方都找不到任何参考。
      • 你能举个例子说明如何使用这个选项吗?
      • @ChristophAdamakis ,您需要的示例已由 Christian Fernando 发布。
      • @PraveenE 你在哪里设置--initialize 选项?
      • @Thomas 这是启动 mysql 时的命令参数。参考dev.mysql.com/doc/refman/5.7/en/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2019-03-14
      • 2019-07-28
      • 2018-11-10
      • 2019-01-30
      • 2013-07-27
      相关资源
      最近更新 更多