docker修改mysql8配置 修改表名區分大小寫問題

一、簡要說明一下羣暉 mysql鏡像的安裝
引入了docker工具,因此可以自行部署mysql服務,也比較簡單,在docker工具->註冊表中搜索mysql,選擇想要下載的鏡像。

image
然後再映像中雙擊對應的鏡像設置相關參數,例如端口,環境需要設置MYSQL_ROOT_PASSWORD 變量,這是root用戶默認的密碼,有的鏡像如果不設置是無法啓動的。

image
點擊“應用”完成後就啓動了。

關於mysql表名區分大小寫的問題

mysql表名是否區分大小寫是通過lower_case_table_names參數來設置,登錄mysql後可通過show Variables like ‘%table_names’ 來查看默認的值。

不同系統,該參數的默認值是不同的。

lower_case_table_names = 1 表名存儲在磁盤是小寫的,但是比較的時候是不區分大小寫

lower_case_table_names=0 表名存儲爲給定的大小和比較是區分大小寫的

lower_case_table_names=2, 表名存儲爲給定的大小寫但是比較的時候是小寫的

1:windows環境默認 0:linux環境默認 2:macos環境默認

二、關於linux鏡像中的mysql參數 lower_case_table_names
上面說到linux系統的lower_case_table_names = 0 默認爲0,但是通常開發測試過程中習慣性的sql語句是不區分大小寫的,需要修改該參數。但是在/etc/mysql/my.cnf中直接修改lower_case_table_names = 1 是不可以的,重啓mysql直接導致docker無法啓動,報如下錯誤信息:

Different lower_case_table_names settings for server (‘1’) and data dictionary (‘0’).

因此lower_case_table_names 無法動態修改。

官方給出了回答

lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.

也就是說如果想修改這個屬性,必須在初始化數據庫的時候就要指定該參數。

通常我們下載的docker mysql 鏡像啓動時會默認初始化,因此想要修改該參數就要重新初始化docker中的數據庫。

三、開始修改mysql鏡像lower_case_table_names參數
1、登錄到mysql docker控制檯

選擇“容器”->“mysql鏡像”->“終端機”->新增bash

另:linux docker進入容器方式:
docker啓動mysql容器,使用命令:

docker exec -it xxxx /bin/bash

xxx 爲mysql容器id

2、在docker中安裝工具
docker中可能沒有相關vim工具,需要自己安裝

apt-get update
apt-get install vim

3、修改mysql默認路徑
爲了方便日後管理,以及初始化數據庫,重新設置mysql的data路徑

mkdir  -p /home/data
mkdir  -p /home/logs
chown -R mysql:mysql /home/data
chown -R mysql:mysql /home/logs
chmod -R 755 /home
chmod -R 755 /home/data
chmod -R 755 /home/logs

4、修改mysql配置文件

cd /etc/mysql/
vi my.cnf

配置文件中在[mysqld]下增加

[mysqld]
datadir=/home/data
log-error=/home/logs/error.log
lower_case_table_names=1

注意:該操作完成後千萬不要重啓docker,否則將無法啓動

5、重新初始化數據庫

/usr/sbin/mysqld --user=mysql --lower-case-table-names=1 --initialize-insecure --basedir=/usr/local/mysql --datadir=/home/data

這裏要等待一段時間
初始化完成後可以查看日誌,主要默認的root密碼爲空。

vi /home/logs/error.log

注意畫紅線部分,初始化爲root@localhost 密碼默認爲空
該步驟完成後,重啓docker,如果沒有失敗說明設置已經生效。

6、登錄驗證參數

mysql -h localhost -u root -p 
Enter password: 直接回車
mysql> show variables like '%table_names'


lower_case_table_names參數已經變爲1

7、新增用戶
由於默認初始化的’root’@‘localhost’ 用戶是不能遠程訪問的。
如果想創建一個遠程訪問的root用戶可以使用創建語句進行創建

mysql> CREATE USER 'root'@'%' IDENTIFIED BY '密碼';
mysql> GRANT ALL ON *.* TO 'root'@'%'  WITH GRANT OPTION;

或者重新創建了一個用戶

mysql> CREATE USER 'admin'@'%' IDENTIFIED BY '密碼';
mysql> GRANT ALL ON *.* TO admin@'%'  WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

7、驗證

mysql> CREATE SCHEMA `lower_case_test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
use lower_case_test;
CREATE TABLE `lower_case_test`.`test1` (
  `idtest1` VARCHAR(10) BINARY);

測試

select * from test1;
select * from Test1;
select * from TEST1;
select * from IDTEST1 from TEST1;

SQL如果都能夠正確執行,說明表名大小寫已經不敏感。

這裏涉及一個題外話就是表裏的數據如果需要區分大小寫需要對字段值設置爲BINARY 屬性。

轉載至:https://www.jianshu.com/p/31e0c94fc69f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章