乙個簡單的MySQL引數導致的連線問題解惑

2021-09-22 19:01:52 字數 3559 閱讀 7159

最近在做一套mysql環境的資料遷移,需要把一部分資料從乙個站點遷移到另外乙個站點,新站點是一套全新的環境,對於mysql的安裝採用了同事建議的二進位制方式。當然安裝的過程比起oracle的安裝看起來要簡單很多了。基本做到了一鍵安裝的程度。因為對於mysql還是有很多的盲點,所以感覺還是有些心虛,當然態度是虛心的了。可能很多問題處理起來就不會像oracle那樣理直氣壯了。這可能也是好事。

資料庫安裝很快就做好了,而且裡面的很多引數也採用了一定的規則去匹配一些引數值,所以自己也沒做其它的改變就直接使用了。使用mysqldump從源站點匯出資料在目標站點匯入。看起來倒也是蠻順利的。接著按照源站點的使用者ip和目標站點的使用者ip進行了對映,看似大功告成。然後對相應的客戶端開通了防火牆許可權,簡單本地測試連線了一下都沒問題,就讓開發的同事來進行聯調了。

但是過了一會兒,他們反饋說連線有問題,自己還是有些心虛,感覺是不是**還是有問題,

他們反饋的問題是使用telnet連線埠3308不通。

比如埠是telnet 10.172.13.23 3308

trying 10.172.13.23...

telnet: connect to address 10.172.13.23: connection refused

對於這個問題,自己也是再三檢視了防火牆的設定,沒有發現問題。自己也連線到他們所在的客戶端去看,發現問題確實存在,但是開了ssh的22埠是沒有問題的。

檢視資料庫中的埠引數,發現竟然是0

> show variables like '%port%';

+---------------------+-------+

| variable_name       | value |

+---------------------+-------+

| extra_port          | 0     |

| innodb_support_xa   | on    |

| large_files_support | on    |

| port                | 0     |

| report_host         |       |

| report_password     |       |

| report_port         | 0     |

| report_user         |       |

+---------------------+-------+

8 rows in set (0.00 sec)

檢視了一下引數檔案的設定

#grep port /etc/my.cnf

port            = 3308

埠也沒有發現問題。檢視資料庫的日誌,發現了下面這麼一段內容。

2015-11-27 18:28:32 9364 [note] event scheduler: loaded 0 events

2015-11-27 18:28:32 9364 [note] /usr/local/mysql/bin/mysqld: ready for connections.

version: '5.6.23-72.1'  socket: '/home/mysql/mysql.sock'  port: 0  percona server (gpl), release 72.1, revision 0503478

從日誌來看也沒有提示警告或者錯誤。

於是帶著疑問去問幾個同事,他們可能認為這個問題不是乙個簡單的問題,我們也分析了一下引數檔案的設定格式,埠,防火牆的限制等等。

我們也在懷疑是不是網路層做了什麼限制,導致3308的埠無法啟用,然後找到系統組的同事幫忙看看,他們直接用了nc的方式開啟乙個3308的埠,然後使用telnet連線就成功了,看來不是系統中網路層設定的限制,那麼問題又回到了資料庫層面。

但是做了多次嘗試,還是無果,最後感覺是不是提供的經典模板不靠譜啊。於是從原來的環境中拷貝了乙份引數檔案,除了個別引數不相容外,做了修改,總算是把庫給帶起來了,檢視埠,這次終於對了,是3308.

但是兩個引數檔案的引數其實設定也還是蠻多的,自己最開始也就想跳過就算了。不過感覺這種問題處理,這次僥倖通過了,下次還是會出現。沒找到根本,自己感覺也不踏實。

同事也建議我做乙個strace來看看。

strace /usr/local/mysql/bin/mysqld —defaults-file=/etc/my.cnf &

但是從trace的情況來看,還是沒有找到更多的有效資訊。

在大晚上開始準備試一試,準備好兩個引數檔案,準備sdiff一下來看看。比較的結果如下,左邊的是沒有問題的,埠正常開放的,右邊的是存在連線問題的。

character-set-server = utf8        character-set-server = utf8

#performance                       #performance

net_read_timeout = 60              net_read_timeout = 60

open_files_limit = 65535           open_files_limit = 65535

back_log = 150                     back_log = 150

max_connections = 500            | max_connections = 350

max_connect_errors = 100000        max_connect_errors = 100000

external-locking = false           external-locking = false

binlog_cache_size = 4m             binlog_cache_size = 4m

performance_schema = 1             performance_schema = 1

timed_mutexes = 1                  timed_mutexes = 1

#locked_in_memory = 1              #locked_in_memory = 1

#max_binlog_cache_size = 2g      | thread_handling=pool-of-threads

#skip-networking                 | extra_port=3300

> extra_max_connections = 1

> thread_pool_max_threads = 300

這是一部分的引數對比情況,自己也是對比了一部分,但是從個別幾個引數調整來重啟測試,還是沒有找到答案。

今天在和同事聊天的過程中,經同事提醒才發現原來是skip-networking導致的,這個引數啟用,則意味著沒有了網路訪問,只有本機的訪問連線,一種用法其實在做維護的時候,為了防止更多的客戶端連線進來,就可以採用這種方式。看來自己繞了乙個大圈子,最後竟然原因是乙個看似簡單的引數導致。簡答調整之後,問題就自然修復了。

所謂吃一塹長一智,這種錯誤以後碰到就會更加從容。看來mysql的引數也需要好好琢磨琢磨了,還有一大堆的坑等著我去踩:)

VLOOKUP函式最後乙個引數導致的問題

今天同事問了我乙個vlookup函式的問題。他在使用這個函式時發現明明有值卻顯示 n a。公式是複製的,只有一行沒有結果,其它都有結果,不存在公式錯誤或者值不對的問題,如下圖所示 我們知道,vlookup第4引數 最後乙個引數 為true或忽略時是非精確匹配,為false或0時是精確匹配,如下圖 同...

close掉乙個失效的MySQL連線導致的程式崩潰

這在沒有鏈結池控制的應用中十分常見,而我正好在做和mysql相關的開發工作,在一般的工具類應用中,並沒有使用鏈結池進行連線的管理,而是直接使用mysql提供的c api進行操作。而這給我的程式帶來過很多麻煩 比如 如下 int main cout mysql ping conn endl mysql...

Calendar 導致的乙個bug

查詢不到資料。把calendar生成的date通過gettime 列印出時間戳。因為資料庫裡的資料是每天生成的,所以對應的時間毫秒為0,而calendar生成的時間沒有對毫秒進行set值覆蓋,導致使用到了當前時間的毫秒值。此時由於查詢條件是 導致這部分資料被忽略掉了。由於 calendar.geti...