顯示具有 mysql 標籤的文章。 顯示所有文章
顯示具有 mysql 標籤的文章。 顯示所有文章

2024-03-23

MySQL: ERROR...Aborted connection...to db: unconnected user:... host:... (init_connect command failed)... MySQL server has gone away!!

呃,沒錯,mysql 又遇坑了

不過遇上的前因是…我在把 apache, mysql, php-fpm, phpmyadmin 利用 docker 來運行在各自專屬的 container 上時,在 phpmyadmin 登入後所出現的訊息

因為這作法我沒有特別在 mysql 的 container 中去指定我自己優化的 mysql.cnf,而是改用 command 的命令加載去啟動的,所以我在 docker-compose.yml 中,mysql 的 command 的部份我有用到

command: [

...,

'--init_connect="SET NAMES utf8mb4"',

'--init_connect="SET collation_connection = utf8mb4_unicode_ci"'

]

然後 docker-compose up 的過程是沒什麼問題,當用 phpmyadmin 登入時就會看到頁面直接出現跟本篇標題差不多的文字,然後資料庫選單沒出現,重整網頁後也只是跳回登入,再次登比也是一樣。

這時我就直接進入 mysql container 內,直接用指令的方式登入

mysql -u {username} -p

剛登入是沒什麼異狀,但要求展示資料庫列表( show databases; )時就出現跟 phpmyadmin 登入時看到的異常訊息是一樣的( 註: 如果直接以高權限的帳戶登入,像 root 反而一切都很正常,沒有異常訊息 )

因為訊息中有提到 "init_connect command failed",所以先把 init_connect 的資料列出來看看

SHOW VARIABLES LIKE '%init_connect';

其結果為

| Variable_name |         Value       |
|-------------------------------------|
| init_connect  | 'SET NAMES utf8mb4' |

因為我有其他的 mysql 也有用到同樣的 init_connect 的命令,但是該命令是寫在 mysql.cnf 中,不是跟本次發生狀況的 mysql 一樣是用 docker 帶參數命令去生成的,所以我進到正常的 mysql 中看了一下,發現列出來的 init_connect 的值是不該帶有單引號的。

所以,我將 docker-compose.yml 中的 mysql 的 command 中有關於 init_connect 的命令改寫成

command: [

...,

'--init_connect=SET NAMES utf8mb4;SET collation_connection = utf8mb4_unicode_ci'

]
這樣 phpmyadmin 或 mysql 的登入就沒有再出現那個異常訊息了

2023-12-05

MySQL 沒有特別注意的 Collation 問題

這情況是一個我沒有特別發現,但是當出現錯誤時卻花了大把的時間 trace & debug 的事…

事由:

    我有兩個表,就叫 a 跟 b 好了

a {

  `id`: big integer, auto_increment, primary key,

  `sn`: varchar(50), utf8mb4_bin, unique key

}

b {

  `id`: big integer, auto_increment, primary key,

  `a_id`: big integer, foreign key references `a`.`id`,

  `sn`: varchar(50), utf8mb4_unicode_ci, unique key

}

我是後面接手維護的,我進行調整 a/b 表的 sn 的計算,利用 mysql trigger before insert 的時候去計算新的 sn,計算的操作是特別為了 a 跟 b 表各別寫一個 function 去做,就先叫 func_a 跟 func_b 好了

因為 b 跟 a 表的關係,所以 b.sn 的編碼格式中是有用到 a.sn 的,所以在 func_b 中,是要先以 NEW.`a_id` 到 a 表查 a.sn 後再回來用 a.sn 來串出 b.sn

2023-03-08

MySQL 遭遇奇怪的 VIEW ERROR 1356 view 'xxx' references invalid table(s) or column(s) or function(s) or definer/invoker...

 環境說明

  • windows server 2019
  • apache 2.4
  • mysql 8.0.28
  • Laravel 8, php 7.4
---
吃完晚餐後,突然接到老闆的 line call 說客戶系統那邊有關 mes 的功能頁面都會出現 server error 的 alarm 訊息,讓我去看看

查看 laravel.log 後發現反饋的訊息是如標題的
view 'xxx' references invalid table(s) or column(s) or function(s) or definer/invoker...

的訊息

看到就利用 CLI 連入 mysql engine 查看 user 權限,但利用 mysql information_schema 查權限,發現都沒有奇怪的地方。

該套系統除了客戶的環境有用,在公司的 aws 的環境上也有用,但沒有同樣的問題發生。

後來直接針對一頁所使用的 api 反查到相關 laravel 的 controller/model 中進行斷點檢查時發現,在經過特定的一行程式後才會出現該異常,在該行程式之前把結果列印出來是正常的…

該行程式主要是進行工單有強制停止屬性的就排除掉,但該系統有分總工單跟明細工單兩種模式,我當下把系統切到明細工單再來瀏覽,發現沒有異常…

而在總工單模式下,要過濾強制停止的工單的作法,是在總工單的 view 表中,有用 JSON_LENGTH() 去把總工單中有多少明細工單的數量獨立出來一個欄位,然後在查表時,先計算總工單中有強制停止屬性的明細工單的數量如果與總工單中明細數量相等的話,就代表該總工單要被過濾掉。

但問題就是發生在這個「比較」上, 假設我是這樣設計 view 表的(假設是叫 view_a)

SELECT JSON_LENGTH(`總工單中的明細工單資料集成`) AS `明細工單總數` FROM `總工單`;

以上存為 view 表

然後在工單查詢中是利用以下的查詢進行過濾

SELECT * FROM `view_a` WHERE JSON_LENGTH( IFNULL( JSON_EXTRACT(`總工單中的明細工單資料集成`, '$.*.強制停止'), '[]')) < `明細工單總數`;

這樣就會出現 1356 的 error

改成

SELECT * FROM `view_a` WHERE JSON_LENGTH( IFNULL( JSON_EXTRACT(`總工單中的明細工單資料集成`, '$.*.強制停止'), '[]')) <JSON_LENGTH(`總工單中的明細工單資料集成`);

就可以正常的執行下去

實在奇怪??? 

2022-10-27

MySQL 5.7 REGEXP 的坑,不支援 Capturing Group ( )

這是在案子上遇到的一次很奇異的狀況…

先描述環境

  • a 區
    • mysql 5.7.40
  • b 區
    • mysql 8.0.31
  • Local
    • mysql 8.0.31

在下的 case 是要在過濾出「不是以 A123 為開頭編號」,要達成這樣的查詢語句(在下只列出 where clause)
  1. WHERE `sn` NOT LIKE 'A123%'
  2. WHERE `sn` REGEXP '^(?!A123).+'
  3. WHERE `sn` NOT REGEXP '^A123'
在下在local開發時,使用 2 的查詢子句,能正確的查詢到結果,然後傳上 b區 要交由 pm 測試,也正常…

所以在下就很放心的直上到 a區 給客戶測,但錯就錯在自己傳上去 a區 時沒馬上自己試試,結果當天下午 pm 就告知客戶有反應有一個功能查出來的資料都是空的,但明明檢查了一下至少會有五、六筆資料的才對,要在下檢查一下。

在下先是看 local 上的版本反應…正常
再看 b區 的反應…正常
那就打開 a區… server error !!!!

奇異了…

後來找出 log 來看,就發現了錯誤訊息「Got error 'repetition-operator operand invalid' from regexp」…

後來在網路上翻找了一下資料,原來在 mysql 8 之前,mysql 的正規表示法是不支援 capturing group 這種用小括號去群組化的方式的…

所以之後在下改用 1 就安然無事了

2022-05-05

在 mysql_secure_installation 一直卡在設定新密碼給 root 中

在下是在使用 Ubuntu 20.04 LTS 安裝 mysql 8.0.29 時遇到以下狀況
$>: sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
 ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.

New password: 
.... 然後就一直重複

2021-08-04

如何將 xampp-win 中的 mariadb 換成 mysql-community 的版本

 xampp-win 中打包的資料庫好像從某個版本開始就改成 mariadb 了,雖然 mariadb 跟 mysql 在大部份的狀況下是相似的,但…mariadb好像到目前的版本(寫文章時mariadb 最新的是10.6.3)在json的使用上跟mysql不太一樣,但我比較習慣用mysql的。

那因為在 linux 中大部份的來源庫好像是mysql的版本,所以比較沒有要從mariadb換mysql的要求…但因為目前service架在windows中,所以xampp-win是用mariadb,就找了一下資料,把mariadb換成mysql engine的方式。

環境說明:

  • xampp-win
    • apache: 2.4.48
    • db: mariadb 10.4.20
  • 要更換為mysql-community 8.0.26
    • 免安裝的版本

mariadb => mysql

2019-09-25

[MySQL]匯入sql大檔時遇到 Unknown MySql server host 與匯入時 charset 的問題

其實這是三個問題

  1. 匯入的sql檔中有單筆資料長度過大的問題「got a packet bigger than 'max_allowed_packet' bytes」
  2. 匯入單個大容量sql檔時因為上列的狀況而有的問題「Unknown MySql server host」
  3. 匯入用utf8匯出的單個大容量sql檔時會出現亂碼問題

2018-10-16

emoji 文字存進 mysql (mariadb) 中變問號(????)!!!!

現在手邊的這個案子真的讓我碰到不少以前顯少會想到或遇到的小麻煩,麻煩不大,但很碎。

不過會這樣碎,大概也跟我自己亂弄有關吧…

----
回正題

這次遇到的狀況是

「我用 ckeditor 在建立訊息,訊息中用了 emoji speech-ballon (💬) 符號,然後透過 php 將訊息存入 mysql 中,存好後撈出資料放在網頁上,遇到該 emoji 符號變 ???? ,四個問號;檢查資料庫中該符號的狀態,也確實是 ???? 四個問號,但並不是每一個 emoji 符號都是四個問號,也有正常顯示的。」

分析:

  1. 使用 ckeditor
  2. emoji
  3. mysql
debug:
  1. ckeditor 我用的只是單純屬前端的版本,網頁 html, php, mysql 我都有確認都有用 utf8 charset ,而且 emoji 符號在 ckeditor 的編輯區中是正常顯示的,所以 ckeditor 應該是沒問題的。
  2. emoji 本身只要你用的瀏覽器不要太舊,基本都內建,而因為 emoji 是 unicode ,所以網頁最好是用 utf8 ,而這點我確認是 ok 的,而且並不是每個 emoji 都異常。
  3. mysql 我內部設定是使用 utf8mb4 ,db, table 的編碼和 table 有中文的欄位編碼我都是設定 utf8mb4 ,但我 php pdo connection 是設定「charset=utf8」,我在「這」看到了版主說明了 utf8 不一定都是 3 bytes ,也有 4 bytes 的,而 mysql 的 utf8mb4 就是支援到了 4 bytes ,然後我在「這」查到 💬 是 4bytes ;所以,問題找到了,是我做 php pdo connection 使用 charset=utf8 的關係,雖然大部份的資料寫入資料庫跟從資料庫讀出都沒啥狀況,但遇到 utf8 4bytes 就會有異常, php 處理過程沒有報錯,但資料確實是 utf8 4bytes 塞不進 utf8 3bytes 的 connection 中…所以將 php pdo connection charset 改為 utf8mb4 後,一切都正常了。
總結:
是我懶,用 utf8mb4 是想用新的編碼也是想說可以避過一些文字上的問題,結果,最後的原因還是自己忘了把一切的 connection 改 utf8mb4 ,害自己找資料翻過頭。

2015-09-29

mysql 匯入資料時使用 LOAD DATA

MySQL 官方解說

我們很常用 csv 這種文字檔來匯入至資料表中,如果是透過 phpmyadmin 這種工具,其實過程是簡單的…但如果我們要在 php 中來使用 csv 匯入的方式咧?

MySQL 在 5.1 時有加入了匯入實體檔案的方式來匯入資料,就是 Load Data Local Infile ,對於直接匯入來說,會比載入 csv 檔,一行一行的丟去執行 SQL command 來的方便…但也是有一些參數要注意

我以簡單的來呈現一下(細的就自己看官方手冊)
1 LOAD DATA LOCAL INFILE  '檔案'
2 INTO TABLE  `表`
3 FIELDS TERMINATED BY  ',' [OPTIONALLY] ENCLOSED BY  '"' ESCAPED BY  '"'
4 LINES TERMINATED BY  '\r\n'
5 IGNORE 1 LINES
 一行一行來解釋
1) 是"載入本機檔案"
2) 要被匯入的"表"
3) 欄位格式設定
    分隔符號:csv 大部份都是半型逗號,但有的會用 \t
    每一欄的包裝符號:OPTIONALLY 沒加上的話,每一欄都會使用半形雙引號包起來;但如果加上了 OPTIONALLY ,那只會是文字表現的欄位才會用包裝符號包起來,其他就不會包。
    跳脫字元:指的就是如果欄位資料中的原始內容就有使用到「包裝符號」,那就要在原始內容前加上跳脫字元,告知系統跳脫字元後的字元是屬除資料,而不是「包裝符號」,沒特別設定的話,預設是 \
4) 一行資料的結尾符號:如果我們是使用 excel 匯出 csv,一般都是 \r\n 為行尾符號,但要注意有時會是只有 \n
5) 跳過幾行:當我們用 excel 匯出 csv 時,大部份第一行都會是「欄位名稱」,這對匯入資料時,這首行是無用的,所以可以設定跳過 1 行。

2014-04-12

[MariaDB]:一個與MySQL同宗,但似乎更佳的DB-Engine---由捨棄MySQL無痛改用MariaDB的教學篇

開宗明義:為了怕之後MySQL變成付費制度,所以改用同宗的MariaDB

經[MySQL 創辦人 Michael Widenius 說:「沒有任何理由再用MySQL」]代入,連google都在去年開始將內部的MySQL部份轉移到MariaDB了,所以,身為一知半解的我們,也該試著玩一玩。

比較文:https://mariadb.com/kb/en/mariadb-vs-mysql-features/
(在文中有說明,MariaDB在10.0之後加入支援NoSQL engine)

需要注意的是,MariaDB現今有5.5與10.0的版本方向(5.5對應的也就是MySQL 5.5,10.0就是MySQL 5.6),分方向別其實應該就是要與MySQL的相關性分離…而且10.0要加入NoSQL支援,也就是分離MySQL了…

參考文:

這邊安裝的是MariaDB 5.5,主要是無痛轉移,所以不用MariaDB 10.0(因為我也不確定10版可不可以等於無痛,安全起見,先用5.5)

主要系統:CentOS 6.5 x86

2014-01-24

天殺的Linux套件更新----當我升級mysql時…

就在今天,一時手癢想來把CentOS 6.5做yum-update…

原先,使用@base與rpmforge的更新都一切正常…


然後,想說再加上epel和remi時發現,mysql可以update到5.5…所以就更新了…

然後,重新啟動mysqld,它就跟我說「無法啟動」…

2009-05-18

Linux-如何使用向windows cervsrt申請的憑證

參照網站:http://blog.yam.com/gavint/article/16121257

--

上述網站說的不錯,一步一步照著走都很ok

以下是大至的做法

先在linux server上產生出key與crt,產生方法如下

key
openssl genrsa -out server.key 1024

crt
openssl req –new –key server.key –out server.csr

Country Name:TW (註:國名代號,二字元限定)

State or Province Name:Taiwan (註:地區名稱)

Locality Name:Tainan (註:地名/城市名)

Organization Name:xyz (註:組織名稱/公司英文名稱)

Organizational Unit Name:cc (註:單位名)

Comman Name:www.abc.com (註:Domain name為主)

Email Address:xxx@xx.xx

2009-02-20

mysql....麥系扣

我遇到問題…
remi更新站台+phpmyadmin 3.1.2+mysql 5.1.31+PHP5.28..........

首先…因為phpmyadmin 3.1.2要php 5.2以上…但centos內裝的為5.1…phpmyadmin會跟你說不合

所以,要加remi來申級到5.2php

不過,最好是在安裝centos的remi之後,進到/etc/yum.repo.d中…把Centos-Base與media先放到別的地方,要不然在yum install或update時,會更新到base的舊版…

不曉得為什麼yum不是自己判斷應該裝哪一個…但也有可能是remi的關係吧…

所以,今天就犯了個錯,base的與remi的我都不小心安裝了mysql,所以engine就會有二個…這會導致mysql啟動錯誤…[timeout.......mysql deamon]之類的訊息

自己玩弄了好久…才發現原來是二個mysql-engine的關係…也發現了yum.repo.d中的base、media先remark起來…只更新remi的就好