#author("2022-06-22T07:24:42+00:00","default:src128","src128")
#author("2022-06-22T07:25:00+00:00","default:src128","src128")
&tag(MySQL8);
*目次 [#n451abf1]
#contents

*関連ページ [#o3976052]
-[[./utf8mb4]]

*参考情報 [#fc93aae4]

*設定 [#d805ca20]


**export/importでcollateが異なってしまう [#r7f695c4]
-mysqldumpによるexport時、create tableのcharsetがutf8mb4で、collateが指定していない場合、
-import時にcollateがutf8mb4_0900_ai_ciになってしまう(collation-serverがutf8mb4_binでも)。
-これはcharsetだけ指定されている場合、そのcharsetのデフォルトのcollateが指定されるというmysqlの仕様らしい。[[MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.3.3 テーブル文字セットおよび照合順序:https://dev.mysql.com/doc/refman/5.6/ja/charset-table.html]]
-これを避けるためには、charsettとcollateをcreate tableで明示しておいたほうがよいっぽい。

**既存のテーブルのcollateを一括設定 [#zd9a2c93]
-[[mysql - How to convert all tables in database to one collation? - Stack Overflow:https://stackoverflow.com/questions/10859966/how-to-convert-all-tables-in-database-to-one-collation/10860122#10860122]]
-以下のコマンドでcollateを変更するSQLを生成できる。以下をcollate.sqlとして保存。
#pre{{
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8mb4_bin;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="mydb"
AND TABLE_TYPE="BASE TABLE";
}}
-以下のように実行してファイルに保存。
 mysql --skip-column-names < collate.sql > collate_change.sql
-collate_change.sqlの内容を確認。。
 ALTER TABLE mydb.test_table COLLATE utf8mb4_bin;
 (...)
-実行。環境によって少し時間が必要かも。
 mysql < collate_change.sql

**caching_sha2_password関連 [#e4f398d7]
-古いライブラリから認証できない場合がある(PHP 7.3以前。PHP 7.4は対応しているはずだがMacPortsから接続できない)。
-もうしばらく安定するまでmysql_native_passwordに設定しておくほうが良いかも(2020/10/26(月)現在)。
-[[MySQL8.0 認証方式を変更する(Laravel5) - Qiita:https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917]]

***状態の確認 [#abc97b85]
-以下のSQLで確認できる
 SELECT user, host, plugin FROM mysql.user;

***新規ユーザーの認証方法を変更 [#y8f706be]
-/etc/my.cnfを変更。
 [mysqld]
 default_authentication_plugin=mysql_native_password

***既存ユーザーの認証方法を変更 [#ofaece70]
-以下のSQLで実行。
 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';

**バイナリログを無効化する [#c82f6c12]
-MySQL8ではバイナリログがデフォルトで有効になっている。
-開発マシンでバイナリログが不要な場合、以下の手順で無効化できる。[[MySQL8.0でバイナリログを無効化する | Tiny Garage:https://tiny-garage.net/disable-binary-log-in-mysql8/]]
-バイナリログ確認。mysqlコマンドで接続し以下のSQLを実行。
 SHOW MASTER LOGS;
-バイナリログ削除。
 PURGE MASTER LOGS before now();
-my.cnfに以下を追加しサーバー再起動。
 disable-log-bin

*トラブルシューティング [#e0e84702]

**MySQLアップグレードで起動しなくなった [#sb76f324]
-MySQL 8のマイナーバージョンアップで以下のエラーが発生。
#pre{{
2022-06-22T05:20:50.904777Z 4 [ERROR] [MY-013178] [Server] Execution of server-side SQL statement '-- Copyright (c) 2018, 2021, Oracle and/or its affiliates. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; version 2 of the License. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -- -- Alters the sys_config table for upgrades -- ALTER TABLE sys_config CHARACTER SET utf8mb4; ' failed with error code = 3958, error message = 'Failed to delete sdi for sys.sys_config in sys/sys_config due to missing record.'.
2022-06-22T05:20:50.907978Z 0 [ERROR] [MY-013380] [Server] Failed to upgrade server.
}}
-MySQL 8はアップグレード時にそれ自体でアップグレード処理を行う(mysql_upgradeは使われなくなった)。[[MySQL :: MySQL 8.0 Reference Manual :: 4.4.5 mysql_upgrade — Check and Upgrade MySQL Tables:https://dev.mysql.com/doc/refman/8.0/en/mysql-upgrade.html]]
-以下の方法で手動で起動できた。「--upgrade=FORCE」がデフォルト。MINIMALは最小限でアップグレード処理を実行しない。
 /opt/local/lib/mysql8/bin/mysqld --user=_mysql --upgrade=MINIMAL
 /opt/local/lib/mysql8/bin/mysqld --user=_mysql --upgrade=MINIMAL
-原因はわからいけれどsysデータベースがエラーだということで、他のマシンのmysqlサーバー(同じバージョン8.0.29)からsysデータベースをdumpして、restoreした。
 $ mysqldump --no-data --routines --databases sys > sys_dump.sql #別のマシン
 $ mysql < sys_dump.sql # エラーが発生したマシン

**「grant all privileges」でエラー [#l935e464]
-MySQL 8ではcreate userしてからgrantしないとだめらしい。
-[[How to grant all privileges to root user in MySQL 8.0 - Stack Overflow:https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user-in-mysql-8-0]]
#pre{{
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
}}

**unknown variable 'validate_password.policy=LOW'が表示される [#t420709a]
-どうやらvalidate_password componentが有効でないとこのエラーが表示されるらしい。[[MySQL :: MySQL 8.0 Reference Manual :: 6.4.3.3 Transitioning to the Password Validation Component:https://dev.mysql.com/doc/refman/8.0/en/validate-password-transitioning.html]]
-以下のコマンドで確認できる。[[MySQL8.0 小ネタ集 | スマートスタイル TECH BLOG|データベース&クラウドの最新技術情報を配信:https://www.s-style.co.jp/blog/2018/07/2106/]]
 SELECT * FROM mysql.component;
-CentOS 8ではデフォルトでvalidate_passwordコンポーネントが有効だが、macportsでは無効?(要確認)。


**リモートから接続できない [#l5d6c2e6]
-skip-networking、bind-addressの設定を確認する。以下はリモートアクセスを許可する設定。
#pre{{
bind-address=0.0.0.0
skip-networking=0
}}
-現在の設定はこれで確認できる。
 $ mysql -b -e "SHOW GLOBAL VARIABLES like 'bind_address'"
-それでもだめな場合ユーザー(rootなど)のアクセス許可がlocalhostに限定されているせいかもしれない。
 select user,host from mysql.user;
 | root             | localhost |
-以下で作成する。 
 create user root@'%' identified by 'hogehoge';
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
**mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces [#he9ca9a4]
-[[mysqldumpでPROCESS権限(PROCESS privilege)を要求される - いっさいがっさい:https://isgs-lab.com/424/]]
-以下を実行。
 mysql > GRANT PROCESS ON *.* TO "your-user";

**PHP 7.3から接続できない [#u3e3a5a0]
-「PHP Warning:  mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to \
the client」エラーが発生。
-PHP 7.2以前のバージョンは、MySQL8の新しいにんしょうほうcaching_sha2_passwordに対応しておらず、mysql_native_password
-[[【PHP】いつの間にやらPDOはMySQLの認証方法 caching_sha2_password に対応済み – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発:https://cpoint-lab.co.jp/article/202004/14783/]]
-PHP 7.4なら大丈夫?と思ったがPHP 7.4からも同様のエラーで接続できない場合あり(MacPorts。2020/10/26(月))。
--MacPortsはだめ
--UbuntuはOK
-面倒をさけるためしばらくmysql_native_passwordをデフォルトにしておいたほうが良いかも。実際CentOS 8.2.2004のデフォルトはmysql_native_password。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS