1. 程式人生 > >使用mysql5.7版本資料庫需要注意的地方/持續更新

使用mysql5.7版本資料庫需要注意的地方/持續更新

資料庫mysql 5.7版本的初始密碼修改

安裝完後實在是找不到初始密碼的檔案,後面發現再錯誤日誌中

先關閉mysql
pkill mysqld
安全模式啟動資料庫並修改密碼
mysqld_safe --skip-grant-tables &

MySQL [mysql]> update user set password=password('xxxx') where user='root';
ERROR 1054 (42S22): Unknown column 'password' in 'field list'
MySQL [mysql]> update user set authentication_string=password('xxxx') where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1

MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

5.7版本中儲存密碼的欄位password改為authentication_string

使用密碼進入資料庫
[[email protected]_47_236_centos ~]# pkill mysqld
[[email protected]_47_236_centos ~]# mysqld_safe --defaults-file=/etc/my.cnf &
[1] 27918
[[email protected]_47_236_centos ~]# 2018-01-22T02:02:49.499702Z mysqld_safe Logging to '/data/mysql/mysql-error.log'.
2018-01-22T02:02:49.518163Z mysqld_safe Starting mysqld daemon with databases from /data/my

MySQL [(none)]> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
MySQL [(none)]> alter user 
[email protected]
'localhost' identified by 'xxxx'; Query OK, 0 rows affected (0.01 sec)

這是可以使用密碼進入資料庫,但是還需要alter user...重新鑑定一下

關閉ONLY_FULL_GROUP_BY

select @@global.sql_mode\G;
*************************** 1. row ***************************
@@global.sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

ERROR:
No query specified

MySQL [(none)]> set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> select @@global.sql_mode\G;
*************************** 1. row ***************************
@@global.sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

sql_mode值的含義:

ONLY_FULL_GROUP_BY:

對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼將認為這個SQL是不合法的,因為列不在GROUP BY從句中

STRICT_TRANS_TABLES:

在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制

NO_ZERO_IN_DATE:

在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入'0000-00-00'。在非嚴格模式,可以接受該日期,但會生成警告。

NO_ZERO_DATE:

在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告

ERROR_FOR_DIVISION_BY_ZERO:

在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。

NO_AUTO_CREATE_USER

防止GRANT自動建立新使用者,除非還指定了密碼。

NO_ENGINE_SUBSTITUTION:

如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲一個異常

系統時間問題

5.7預設為UTC時間,所以檢視日誌的時候時間是對不上的,時差8H

檢視當前mysql時區

MySQL [(none)]> SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| log_timestamps | UTC |
+----------------+--------+
1 row in set (0.01 sec)

需要在mysql的配置檔案中[mysqld]中增加一條log_timestamps的配置

log_timestamps=SYSTEM
MySQL [(none)]> SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| log_timestamps | SYSTEM |
+----------------+--------+
1 row in set (0.01 sec)

bin_log日誌的管理

日誌檔案過大,檢視的時候會很好效能,所以建議可以設定一個閾值,到達閾值輪替,並且設定儲存時間
配置檔案[mysqld]中新增如下:

log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 7
max_binlog_size = 20M

儲存7天,日誌檔案最大為20M

MySQL5.7中NULL和空值0的計算區別

公司業務上遇到相關問題,SQL語句如下:

MySQL [tw2]> SELECT * FROM tw_member WHERE hid!="";
+---------+--------------+---------+-----+-------+----------+----------------------------------+-------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| id | nickname | headimg | hid | level | username | password | email | mobile | update_time | create_time | status | leader_id | is_share_member | is_inside | platform_id | role_id | examine_id |
+---------+--------------+---------+-----+-------+----------+----------------------------------+-------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| 1148961 | 曾亞瑞 | NULL | 38 | 2 | z323555 | 00d92e9294d484574d50863b4d547c5c | | 15087149162 | 1524711596 | 1524707736 | -1 | 1 | 0 | 1 | 999 | 2 | 0 |
| 1148962 | 第三方 | NULL | 999 | 0 | sdf55 | 00d92e9294d484574d50863b4d547c5c | | 13072766592 | 1524736018 | 1524710328 | 1 | 1 | 0 | 1 | 999 | 0 | 0 |
| 1148963 | 薩芬 | NULL | 38 | 9 | dsfa545 | 00d92e9294d484574d50863b4d547c5c | | 13772766591 | 0 | 1524710356 | 1 | 1 | 0 | 1 | 999 | 20 | 0 |
| 1148965 | 撒旦法 | NULL | 38 | 9 | fsdf55 | 00d92e9294d484574d50863b4d547c5c | | 13995913628 | 0 | 1524712960 | 1 | 1148961 | 0 | 1 | 999 | 22 | 0 |
| 1148966 | 隨碟附送 | NULL | 38 | 2 | sdf5454 | 00d92e9294d484574d50863b4d547c5c | | 13995951362 | 1524793149 | 1524713664 | 1 | 1 | 0 | 1 | 999 | 1 | 0 |
+---------+--------------+---------+-----+-------+----------+----------------------------------+-------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
5 rows in set (0.00 sec)

MySQL [tw2]> SELECT * FROM tw_member WHERE hid is not NULL;
+---------+--------------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| id | nickname | headimg | hid | level | username | password | email | mobile | update_time | create_time | status | leader_id | is_share_member | is_inside | platform_id | role_id | examine_id |
+---------+--------------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| 1 | admin | 43 | 0 | 1 | admin | 13a7669e31f85e25a6047a3a98b66375 | [email protected] | 18555550710 | 1524793653 | 1513216128 | 1 | 0 | 0 | 1 | 999 | 0 | 0 |
| 1148961 | 曾亞瑞 | NULL | 38 | 2 | z323555 | 00d92e9294d484574d50863b4d547c5c | | 15087149162 | 1524711596 | 1524707736 | -1 | 1 | 0 | 1 | 999 | 2 | 0 |
| 1148962 | 第三方 | NULL | 999 | 0 | sdf55 | 00d92e9294d484574d50863b4d547c5c | | 13072766592 | 1524736018 | 1524710328 | 1 | 1 | 0 | 1 | 999 | 0 | 0 |
| 1148963 | 薩芬 | NULL | 38 | 9 | dsfa545 | 00d92e9294d484574d50863b4d547c5c | | 13772766591 | 0 | 1524710356 | 1 | 1 | 0 | 1 | 999 | 20 | 0 |
| 1148964 | 撒旦法 | NULL | 0 | 9 | sdf66 | 00d92e9294d484574d50863b4d547c5c | | 13372766591 | 1524734787 | 1524710438 | -2 | 1 | 0 | 1 | 999 | 0 | 0 |
| 1148965 | 撒旦法 | NULL | 38 | 9 | fsdf55 | 00d92e9294d484574d50863b4d547c5c | | 13995913628 | 0 | 1524712960 | 1 | 1148961 | 0 | 1 | 999 | 22 | 0 |
| 1148966 | 隨碟附送 | NULL | 38 | 2 | sdf5454 | 00d92e9294d484574d50863b4d547c5c | | 13995951362 | 1524793149 | 1524713664 | 1 | 1 | 0 | 1 | 999 | 1 | 0 |
+---------+--------------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
7 rows in set (0.00 sec)

MySQL [tw2]> SELECT * FROM tw_member WHERE hid="";
+---------+-----------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| id | nickname | headimg | hid | level | username | password | email | mobile | update_time | create_time | status | leader_id | is_share_member | is_inside | platform_id | role_id | examine_id |
+---------+-----------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
| 1 | admin | 43 | 0 | 1 | admin | 13a7669e31f85e25a6047a3a98b66375 | [email protected] | 18555550710 | 1524793653 | 1513216128 | 1 | 0 | 0 | 1 | 999 | 0 | 0 |
| 1148964 | 撒旦法 | NULL | 0 | 9 | sdf66 | 00d92e9294d484574d50863b4d547c5c | | 13372766591 | 1524734787 | 1524710438 | -2 | 1 | 0 | 1 | 999 | 0 | 0 |
+---------+-----------+---------+-----+-------+----------+----------------------------------+------------------+-------------+-------------+-------------+--------+-----------+-----------------+-----------+-------------+---------+------------+
2 rows in set (0.00 sec)

MySQL [tw2]> SELECT * FROM tw_member WHERE hid is NULL;
Empty set (0.00 sec)

總結一下:

  • NULL是佔用資料空間的,但是空值‘’是不佔用的(據說,未實測)
  • NULL不能參與計算,空值可以;NULL只能用is null參與篩選
  • 資料型別如果是字串型,不是int型,篩選無影響

    SELECT /!40001 SQL_NO_CACHE / * FROM ...

    在MySQL慢查詢日誌中出現SELECT /*!40001 SQL_NO_CACHE */ * FROM語句
    對應的應用場景是在備份資料庫mysqldump命令

/* .... / 在大部分語言中都一樣是註釋。這個之中的語句是不被執行的。但MYSQL中 為了保持相容,比如從mysqldump 匯出的SQL語句能被其它資料庫直接使用,它把一些特有的僅在MYSQL上的語句放在 /! ... / 中,這樣這些語句如果在其它資料庫中是不會被執行,但在MYSQL中它會執行。
MySQL對標準SQL的擴充套件MySQL伺服器包含一些其他SQL DBMS中不具備的擴充套件。注意,如果使用了它們,將無法把程式碼移植到其他SQL伺服器。在某些情況下,你可以編寫包含MySQL擴充套件的程式碼,但仍保持其可移植性,方法是用“/
... /”註釋掉這些擴充套件。在本例中,MySQL伺服器能夠解析並執行註釋中的程式碼,就像對待其他MySQL語句一樣,但其他SQL伺服器將忽略這些擴充套件。例如: SELECT /! STRAIGHT_JOIN / col_name FROM table1,table2 WHERE ...如果在字元“!”後添加了版本號,僅當MySQL的版本等於或高於指定的版本號時才會執行註釋中的語法: CREATE /!32302 TEMPORARY */ TABLE t (a INT);這意味著,如果你的版本號為3.23.02或更高,MySQL伺服器將使用TEMPORARY關鍵字。

group_concat_max_len

GROUP_CONCAT函式用於將多個字串連線成一個字串,在拼接成字串時就會存在拼接長度的問題,mysql 預設的拼接最大長度為1024 個位元組,由於1024個位元組會出現不夠用的情況,所以有時需要去根據情況進行修改

動態修改引數


show variables like 'group_concat_max_len';

SET GLOBAL group_concat_max_len = 102400;
SET SESSION group_concat_max_len = 102400;

有時我們並不知需要多大的位元組才能滿足需求,此種情況可以考慮不設定最大位元組(即採用最大位元組數)即在配置檔案設定group_concat_max_len=-1