MySQL使用中遇到的問題及日常操作累積(持續更新)
來自: http://blog.csdn.net//jiao_fuyou/article/details/46302127
【20151012】TIMESTAMP列字段說明
create table test( aaa char(32), createtime TIMESTAMP ); show create table test; CREATE TABLE `test` ( `aaa` char(32) COLLATE latin1_bin DEFAULT NULL, `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
這里的
createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
意味更新記錄時,createtime字段都會被設置為當前時間
可以單獨設置:
CREATE TABLE `test` ( `aaa` char(32) COLLATE latin1_bin DEFAULT NULL, `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
這樣更新記錄時就不會自動更改這個字段值了。
【20150910】ERROR 1449 (HY000): The user specified as a definer (‘root’@’%’) does not exist
一個表好久沒插入數據了,今天業務插入數據時竟然提示:
ERROR 1449 (HY000): The user specified as a definer (‘root’@’%’) does not exist
檢查了好長時間,發現沒有用 (‘root’@’%’)連接mysql的地方,最后發現這張表有一個trigger,建立時是用(‘root’@’%’)建立的。這時想起來,mysql一開始是沒有限制權限的,默認都是(‘root’@’%’)連接,后來加了用戶訪問權限,刪除了(‘root’@’%’),結果導致沒有權限執行這個觸發器。
處理方法:刪除并重建觸發器就可以了。
20150626 mysql master重啟后slave延遲問題
今天mysql master重啟后,slave一直延遲,show slave status一直顯示:
Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 158782
但master上log明明到了mysql-bin.000007,原來是slave_net_timeout參數的問題
修改my.cnf,增加:
slave_net_timeout = 30當slave從主數據庫讀取log數據失敗后,等待多久重新建立連接并獲取數據。
MySQL主從復制的時候, 當Master和Slave之間的網絡中斷,但是Master和Slave無法察覺的情況下(比如防火墻或者路由問題)。Slave會等待slave_net_timeout設置的秒數后,才能認為網絡出現故障,然后才會重連并且追趕這段時間主庫的數據。默認是3600秒,建議設置:30</pre>
修改MASTER_CONNECT_RETRY參數:
change master to MASTER_CONNECT_RETRY=15;當重新建立主從連接時,如果連接建立失敗,間隔多久后重試。默認設置為 60秒,建議設置:15</pre>
20150605 Replicate_Do_DB
該參數如果想匹配多個數據庫,要在配置文件中寫多行Replicate_Do_DB=XXX,而不能在一行中以’,’分隔寫多個,這樣寫一個也不生效。
20150601:slave_net_timeout 問題一則
在一個已經建立主從復制關系的系統里面,正常情況下,由從庫向主庫發送一個 COM_BINLOG_DUMP 命令后,主庫有新的binlog event,會向備庫發送binlog。
但是如果主庫長時間(大于slave_net_timeout)沒有向從庫發送binlog,從庫就會認為主從連接中斷向主庫發起重連請求。slave_net_timeout是設置在多少秒沒收到主庫傳來的Binary Logs events之后,從庫認為網絡超時,Slave IO線程會重新連接主庫。
該參數的默認值是3600s ,時間太久會造成數據庫延遲或者主備庫直接的鏈接異常不能及時發現
將 slave_net_timeout 設得很短會造成 Master 沒有數據更新時頻繁重連。
一般線上設置為5s 。
20141128:關于mysql字符集
| character_set_client | gb2312 | | character_set_connection | gb2312 | | character_set_database | latin1 | | character_set_results | gb2312 | | character_set_server | latin1 |請求轉換邏輯是:character_set_client -> character_set_connection -> character_set_database(table,column)/character_set_server
返回轉換邏輯是:character_set_database(table,column)/character_set_server -> character_set_results
但是需要注意,如果表、數據庫、服務是latin1的字符集,除非character_set_client、character_set_connection、character_set_results的編碼都是latin1,不然是無法轉換成功的,因為latin1本身并不關心是不是漢字,它只是按字節流存儲
20141126:mysql的權限設置
最近在mysql的權限設置時,grant select on test.* to voip@’%’,生效后用voip登錄,發現test庫仍然可以有其它create,drop操作,后來發現默認安裝后test庫是對所有用戶都有所有權限的,select * from mysql.db可以看到;
歷史記錄
1、Starting MySQL.The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).[失敗] 最后原因竟然是my.cnf配置錯誤,有兩條重復內容,innodb_flush_method = O_DRIECT 2、[root@localhost bin]# ./mysqlbinlog /var/lib/mysql/mysql-bin.000053 ./mysqlbinlog: unknown variable 'default-character-set=latin1' 原因是my.cnf配置文件中,最后兩行mysqlbinlog程序不能識別 [client] user = root password = cpyf port = 3306 socket = /tmp/mysql.sock default-character-set=latin1 tee = /home/jfy/tmp/mysql_opt.sql解決辦法:一是修改my.cnf屏蔽這兩行,二是在mysqlbinlog命令中加入--no-defaults 選項就不會讀取my.cnf中client段的默認的配置了
這個錯誤還會出現在一些象mysqladmin這種客戶端工具上。
3、如何回收InnoDB表空間 大家知道InnoDB表,插入大量數據后,表文件大小會變大,然后即使刪除了數據,表空間大小也不縮小 可以按以下幾種方法來做。
truncate table analyze table optimize table alter table xx engine=innodb
如果還不行,那么只有先備份數據,然后drop table,再導入數據了
4、MYSQL交互式與非交互式連接會話有什么不同? 研究wait_timeout參數,牽扯出交互式和非交互式連接,那么到底什么是交互式連接,什么是非交互連接呢,就這么一個小問題,找遍所有網站也沒有一個明確答案
自己總結一下: 交互式,用tcp連接上去,象mysql自帶的客戶端工具,還有象mysql_real_connect庫函數這樣的連接MYSQL的程序 非交互式,象ODBC與JDBC這種連接方式,mysql < ins.sql,這種方法,其實也是一種非交互式的
那么mysql_real_connect中的“CLIENT_INTERACTIVE”選項,帶這個參數與不帶這個參數有什么不同呢?MYSQL服務器什么做什么特殊處理呢?我一直迷惑
5、MySQL的read-only選項: 今天在從機上開起read-only選項,insert和update還是可以成功,原來我用的是super權限,super權限在read-only狀態是允許寫操作的。 read-only選項:對所有的非臨時表進行只讀控制。但是有兩種情況例外:
- 對replication threads例外,以保證slave能夠正常的進行replication。
- 對于擁有super權限的用戶,可以ignore這個選項。
SUPER 權限 :
- 可以有change master to, kill其他用戶的線程的權限。
- Purge binary logs 來刪除binary log, set global來動態設置變量的權限。
- 執行mysqladmin debug命令,開啟或者關閉log,在read-only打開時執行update/insert操作。
- 執行start slave, stop slave.
- 當連接數已經達到max_connections的最大值時,也可以連接到server。
6、MySQL服務啟動后怎么執行SQL語句:修改my.cnf,在mysqld段中加入:init-file = /usr/local/mysql/data/init-file.sql,就可以了
IP address could not be resolved: Temporary failure in name resolution 關于Relay Log無法自動刪除的問題(Neither --relay-log nor --relay-log-index were used)</pre> </div>