52AV手機A片王|52AV.ONE

標題: mysqld 升級到8以上遇到的問題 [打印本頁]

作者: coav4u    時間: 2021-3-14 13:06
標題: mysqld 升級到8以上遇到的問題
(1)
( a, O6 G( {$ X& v  ^8 Pphp連到mysql出現2行errors : (discuz網頁出現的是連接到mysql錯誤表格,需自行寫一隻連接mysql的php程式來測試)
! t8 ?% f1 m7 F% O* N/ H- M

; \1 G  e+ G& K1 Pmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers8 z) {( `" F: S! U
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers  \( R  ^/ r& ^) _
原因:
/ S& A: o- Z- }- w% @1 o
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:: y6 ?' n# }: c/ w
vi /etc/my.cnf  加入下列:
. ~# e# a' {+ b) X, ?: S[mysqld]6 y8 A% m: A, }

! T% }9 f  g1 t4 X1 Icharacter-set-server=utf8
2 p& {! r  s( B5 }2 h6 u* ndefault_authentication_plugin=mysql_native_password. X- ]% J/ i' Z( C9 ]
validate_password.policy=LOW( J" i) Q( |6 Q3 x& a
[mysql]! g3 h) N+ k! S# R6 G" m1 D
default-character-set=utf8" v9 B6 F1 ?1 U: g3 U% D0 Q  v
5 r! {! h7 r% ^4 P
[client]
* l$ f; n; b, c; L1 tdefault-character-set=utf8
; P' c' @/ `, _0 f- [" w
0 N- T7 i) m- G  v然後重啟mysqld
9 J$ ^# a% K6 P# w  n1 l+ Hservice mysqld restart

) L8 Q$ M6 m. H% B# |) i
7 y6 c9 S$ d- \% R6 _
重啟後可能須做下列動作:
5 I( k: d7 j3 Mmysql -u roor -p  8 [7 T- T% A% q/ }; N2 l) E$ x
SHOW VARIABLES LIKE 'validate_password%';7 h$ r. N# {! f. Q# ^
SET GLOBAL validate_password_policy=LOW;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';搞定!!
- q5 Z& {4 a8 {  q4 ?1 ]. @6 J1 `7 b* ?6 [: V+ M5 q
註: mysqld啟動時,在/var/log/mysql/mysqld.log紀錄著:
註: 可以先寫支php程式以測試 ~~~
  f7 D1 D" I7 C+ s
  1. <?
    $ @: e. _% q, Y) a+ P4 s5 ~
  2. $hostname = "x.x.x.x";
    3 X2 p# ~5 `2 M
  3. $database = "db_name";7 ^5 ?! y( Z2 ?
  4. $username = "user_name";
    $ B) H3 j) }  H0 q
  5. $password = "pwd";( h0 m+ Z% m. ?2 Q$ C; F1 r- ?

  6. 7 v" [" v& v9 U' g. q
  7. $conn = mysqli_connect($hostname, $username, $password,$database) or trigger_error(mysql_error(),E_USER_ERROR);8 v- y+ U0 x9 u5 [2 `
  8. mysqli_query($conn ,"SET NAMES utf8");
    - C: [; g: ?7 d" s$ L. W

  9. % k7 s4 Y4 `* V9 S2 M6 I+ Z
  10. $sql = "select count(*) as total from " .  "table_name";
    $ O2 M& ~  X% m7 q7 T) R
  11. $rec = mysqli_fetch_assoc(mysqli_query( $conn,$sql));& \. G  ^3 h1 O) O
  12. echo $rec['total'];# t: `6 f9 R# s7 v6 T
  13. mysqli_close($conn);
    " b, a2 _, }6 \5 z& K
  14. ?>
複製代碼
[hide=d100000000000000000000,999999999999]於video1主機下 /test/connectmysql8.php[/hide]
# X9 P+ \+ Q4 A$ k
: y0 }7 n3 V4 B# x' k8 _
$ A% ]) R0 w4 M5 Q, ?/ y- n當php 7.2.24  connect to mysql server,出現 :
  1. PHP Fatal error:  Uncaught Error: Call to undefined function mysqli_connect() in /test/connectmysql8.php:9# J! z6 i$ T. |6 L# a9 s
  2. Stack trace:
    5 A# `2 S0 [3 r
  3. #0 {main}
    ) U, E. G" d1 Y; J+ `6 K1 N! @3 u
  4.   thrown in /test/connectmysql8.php on line 9& q& Z& S% u3 G( S5 X) |

  5. 3 U' z$ S- K& a! N3 q* O+ a1 ^
  6. Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /test/connectmysql8.php:9- O% E+ Q# h6 V5 o2 G
  7. Stack trace:+ l  f$ i3 T( x0 n& [
  8. #0 {main}6 k0 x$ j0 [5 r7 W) {+ D
  9.   thrown in /test/connectmysql8.php on line 9
複製代碼
這是版本相依的問題,只要 yum install php-mysqlnd  或 yum install php-mysqli 即可
+ w7 E( P! L" {! F+ Z0 `$ O- f. j9 \7 {* e

. f4 ]" N' c5 M6 p[Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
; E5 S; T0 L9 K( v說明: 千萬不能照它建議用"UTF8MB4",否則無法成功啟動2 y1 N' \2 \* [* r- j# f

) J% Q& o# P" T0 i: p5 p: [(2)$ l, y$ b0 ^& [, w# }( l
(1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'system>0' at line 15 r1 L! P0 D* h4 s
SELECT COUNT(*) FROM common_usergroup WHERE type='special' and system>00 ^3 G; Q& E( w, {3 j
; Q) w1 y) w+ [. X
(1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups = '' AND starttime<=1532077291 AND (endtime>=1532077291 OR endtime=0) ORD' at line 1. X( Z  z0 m. J; M  P. t
SELECT * FROM forum_announcement WHERE type!=2 AND groups = '' AND starttime<=1532077291 AND (endtime>=1532077291 OR endtime=0) ORDER BY displayorder, starttime DESC, id DESC LIMIT 1
4 Z( F# N+ l$ Y& f5 t* p
) w$ D/ V) ]" d% J因為MySQL 8.0+將system和groups作為了關鍵字,所以不能直接在SQL中將system和groups這兩個詞作為數據庫、數據表、數據表字段中的任意一種使用,如果數據庫名或數據表名或數據表字段名使用了system或groups作為名字,必須使用一對反引號引用起來。寫作`system`或`groups`。( G: }6 ^  l6 z. ^! d6 q  M
. t) ~# B" z& l% P9 \. s
第一個錯誤需要找到Discuz!目錄中的source\class\table\table_common_usergroup.php,
6 T  U& A2 {/ B將文件中所有的system全部改成`system`,保存後重新上傳到服務器的相同目錄即可。; Z/ b9 V" F# z3 l% F" [
& P6 ~6 l* u% f: N! R8 }
第二個錯誤需要找到Discuz!目錄下中的source\class\table\table_forum_announcement.php,1 Y. K7 X( R! t" e
將文件中所有的groups全部改為`groups`,保存後重新上傳到服務器的相同目錄即可。' b* L0 ?2 A% a
7 @( i$ r8 ~8 N; `7 `
如果在MySQL 8+環境下安裝Discuz!,在安裝前需要給install\data\install.sql文件中沒有加引號的所有system逐一添加一對反引號保存重新上傳到服務器的相同目錄,否則也會出現SQL語法錯誤。
+ f0 G; P- _* M, |, V+ W2 h5 [4 w/ V8 f. W) [# h  w
為了避免語法錯誤,在寫SQL語句時,一定要為所有的數據庫名、數據表名、數據表字段名全部添加一對反引號,像Discuz!這樣的寫法是很不妥的。
. i  Z( D! ~( ^. q" B以上參考:   升級到 MySQL 8.0+ 後Discuz! 更新緩存時出現SQL語法錯誤

0 I/ N# Q8 ^+ j- S0 q5 F1 Z+ e0 m# }* Q% o8 y, o( [
# E: T) P9 c1 p. \8 Q
& M+ w6 d4 r2 x4 n2 H

, P: m* U8 _/ p. h' Z( v3 s




歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/) Powered by Discuz! X3.2