[MySQL]毎日の記録共有

記事ディレクトリ

デバッグを最適化する

1.遅いログ:

低速ログの構成:http:
//www.cnblogs.com/luyucheng/p/6265594.html pt-query-digest詳細な低速クエリログ:http://www.ywnds.com/ p = 8179

文法

1. group_concat:

グループ化クエリはグループ化フィールドに従って、グループ内の関数CONCATおよびGROUP_CONCATの使用を示します。

環境構成

1. MySQLデータベースのセキュリティ強化

1. MySQL importsqlエラー「max_allowed_pa​​cket」バイトより大きいパケットを取得しました

mysqlバックアップファイルが正常に復元できるかどうかをテストするときに、バックアップファイルを別のサーバーインスタンスに復元しようとすると、一連のエラーが発生しました。
エラーは次のとおりです。
[Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes [Err] 1046 - No database selected [Err] 1231 - Variable 'collation_connection' can't be set to the value of 'NULL'
………………

  • 理由:
    主に最初のエラー。インポートされたデータパケットは、システムによって設定されたmax_allowed_pa​​cketサイズよりも大きくなります。
    復元されたインスタンスのバージョンは次のとおり
    です。mysql5.7.13-logデフォルトのmax_allowed_pa​​cketサイズは次のとおりです。4Mmysql
    では、1つのsqlステートメントがMySQLサーバーに送信されるか、1行のデータがクライアントに送信されるか、バイナリログがマスターからスレーブへ。パッケージとして(mysql 5.7の最大パッケージは1GBです)。私のバックアップスクリプトでは、一部のテーブルフィールドがロングテキストタイプであり、挿入された値が比較的長いため、エラーが発生しました。

  • 解決:

    4Mでは足りないので20MBに設定してください。

    現在のmax_allowed_pa​​cketサイズを表示します。

    show variables like 'max_allowed_packet';  
    show variables where Variable_name = 'max_allowed_packet';
    

    コマンドラインでグローバル変数を設定すると、新しい接続がすぐに有効になります:(ウィンドウにバイトサイズを書き込む)
    set global max_allowed_packet = 20*1024*1024;

    同時に、構成ファイルに次のパラメーターを追加します。max_allowed_packet = 20M

2. mysqli :: real_connect():ヘッダーとクライアントライブラリのマイナーバージョンの不一致

yum remove php-mysql
yum install php-mysqlnd

// 重启mysql服务
systemctl start mysqld

// 第一个检索的“password”后面root@localhost: 后面跟着的密码应该就是默认密码了。
grep password /var/log/mysqld.log 

3. innodb_log_fileパラメーターを変更した後、MySQL / MariaDBを起動できません:ログファイル./ib_logfile0のサイズが異なります

解決

4. Pleskを更新できません:Ariaエンジンが有効になっていないか、起動しませんでした

解決

5.MySQLはIPv6データベースに接続します

プロジェクト構成:[ipv6アドレス](角括弧で囲まれています)

サーバー上:--bind-address=ipv6地址
デュアルスタックをサポートするために、それはOKです--bind-address= ::

6.MySQLログを表示する

 # 查看mysql启动失败的日志,从日志内容寻找解决方案
	cat /var/log/mysqld.log | tail -30 

7.マスタースレーブデータベースを構成します

  • Failed to load slave replication state from table mysql.gtid_slave_pos: 1932: Table 'mysql.gtid_slave_pos' doesn't exist in engine
    解決

  • Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

    第一步: 空格问题
    	看主库 MySQL配置文件(/etc/my.cnf)中 log-bin=/var/lib/mysql/binlog.index  是否有空格
    第二步: 看文件
    	查看binlog.index ,或者说查看/var/lib/mysql 的文件情况
    第三步: 从库操作
        mysql > stop slave;
        mysql > reset slave;
        mysql > start slave;
    
  • マスターとスレーブをリセットします:https://www.cnblogs.com/sunyuxun/archive/2012/09/13/2683338.html

  • ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
    スレーブライブラリをリセットします: reset slave;-> start slave;-> show slave status\G;OK

  • MySQLマスタースレーブの不整合の状況と解決策
    https://blog.csdn.net/hardworking0323/article/details/81046408?utm_source=blogxgwz0

  • スレーブ2013は、初期通信パケットの読み取り時にMySQLサーバーへの接続を失いました

    [mysqld] 段增加一个启动参数 
    
    skip-name-resolve 
    
  • クエリでエラー「ユーザーテーブルに一致する行が見つかりません」。デフォルトのデータベース: ''。クエリ: 'GRANT CREATE、DROP、RELOAD、SHUTDOWN、PROCESS、FILE、REFERENCES、INDEX、ALTER、SHOW DATABASES、SUPER、CREATE TEMPORARY TABLES、LOCK TABLES、EXECUTE、REPLICATION SLAVE、REPLICATION CLIENT、CREATE VIEW、SHOW VIEW、CREATE ROUTINE 、ALTER ROUTINE、CREATE USER、EVENT、TRIGGERON TO'mysqld '@'% 'WITH GRANT OPTION'

    删除mysqld 的 从库 权限
    revoke replication slave, replication client on *.* from 'mysqld'%';
    报错: error 1290 (hy000) the mysql server is running with the --skip-grant-tables
    执行: flush privileges;
    重新执行: revoke replication slave, replication client on *.* from 'mysqld'%';
    再执行 :  flush privileges;
    
    

8.エラー1819(HY000):パスワードが現在のポリシー要件を満たしていません

https://www.cnblogs.com/tongxiaoda/p/7873478.html
检测配置

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | STRONG |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.02 sec)

mysql> set password=password('abc');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> set password=password('mysql2017');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> set password=password('mysql@)!&');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> set password=password('MY@)!&sql2017');
Query OK, 0 rows affected, 1 warning (0.00 sec)

关于validate_password_policy-密码强度检查等级:

Policy          Tests Performed
0 or LOW    Length
1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters
2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file

9.mysqlはデフォルトでは大文字と小文字を区別しません

情報を照会して照合(校正)を設定する必要があることがわかりました。照合ルール:

  • _bin:大文字と小文字を区別するバイナリ照合を示します。つまり、大文字と小文字を区別します。
  • _cs:大文字と小文字を区別する照合、大文字と小文字を区別
  • _ci:大文字と小文字を区別しない照合、大文字と小文字を区別しない
    ソリューション:
  1. クエリ条件を使用できますbinaryといった:select * from TableA where binary columnA ='aaa';
  2. このフィールドの照合順序をバイナリに変更できます
  3. テーブルを作成するときは、
    create table some_table(
       str char(20) binary 
    )

10.mysqlインデックスが長すぎます1071-最大キー長は767バイトです

问题
create table: Specified key was too long; max key length is 767 bytes
 
原因
数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引
而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异)
 
于是utf8字符编码下,255*3 byte 超过限制
 
解决
1  使用innodb引擎;
2  启用innodb_large_prefix选项,将约束项扩展至3072byte;
3  重新创建数据库;
 
my.cnf配置:
default-storage-engine=INNODB
innodb_large_prefix=on
 
 
一般情况下不建议使用这么长的索引,对性能有一定影响;

原文链接:https://www.cnblogs.com/littleatp/p/4612896.html

参考文档:
https://dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.html

11.不明な変数 'bind-address = 0.0.0.0'

出现问题的情况
[mysql]
bind-address=::  (127.0.0.1 或者 0.0.0.0)


解决方案:
在 /etc/mysql/my.cnf  中添加
[mysqld]
bind-address=::

12. MariaDBは、パスワードなしでログインできるという問題を解決します

1 正常mysql
2 mysql> select user, plugin from mysql.user where plugin = 'mysql_native_password';
3 +-----------+-----------------------+
4 | user      | plugin                |
5 +-----------+-----------------------+
6 | root      | mysql_native_password |
7 +-----------+-----------------------+
8 8 rows in set (0.00 sec)
 

1 不正常的
2 
3 MariaDB [(none)]> select user, plugin from mysql.user;
4 +------+-------------+
5 | user | plugin      |
6 +------+-------------+
7 | root | unix_socket |
8 +------+-------------+
9 1 row in set (0.00 sec)
看到这里应该发现问题了,按照正常的修改就行了

如下:

 1 sudo service mysql stop
 2 sudo mysqld_safe --skip-grant-tables
 3 进去mysql执行如下命令:
 4 MariaDB [(none)]> UPDATE mysql.user SET authentication_string = PASSWORD('mypassword'), plugin = 'mysql_native_password' WHERE User = 'root' AND Host = 'localhost';
 5 MariaDB [(none)]> FLUSH PRIVILEGES;
 6 验证:
 7 MariaDB [(none)]> select user, plugin from mysql.user
 8     -> ;
 9 +------+-----------------------+
10 | user | plugin                |
11 +------+-----------------------+
12 | root | mysql_native_password |
13 +------+-----------------------+
14 1 row in set (0.01 sec)
15 
16 先杀死mysql  kill -9 pid
17 启动:
18 sudo service mysql start
最后验证下:需要密码了

root@ubuntu:~# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
root@ubuntu:~# 

13.报错:エラー2002(HY000):ソケット '/ var /lib/mysql/mysql.sock'を介してローカルMySQLサーバーに接続できません(2)

通常、障害が発生した場合、ユーザーはmysqlユーザーに切り替えません。これにより、権限の問題が発生し、mysql認証テーブルを作成できないため、/ tmp /mysql.sockファイルとhostname.pidファイルを作成できません。したがって、再認証して安全に開始してください

mysql_install_db     //重建授权表
mysqld_safe &      //mysqld安全启动
systemctl restart apache2        //重启服务器

14.tcログを初期化できません

MariaDB Fix “Can’t init tc log” Error
February 27, 2018 at 12:12 · Filed under Software

Imessed up my automation of backups, meaning that after two years my entire VPS had secretly filled up. This lead to MariaDB being unable to initialize. After taking care of the root cause MariaDB still refused to start.

$ sudo tail -3 /var/log/mysql/error.log
2018-02-20 12:07:45 140649776292416 [Note] Recovering after a crash using tc.log
2018-02-20 12:07:45 140649776292416 [ERROR] Can't init tc log
2018-02-20 12:07:45 140649776292416 [ERROR] Aborting

解决
just removing the zero byte `/var/lib/mysql/tc.log` file took care of the problem.
只需删除零字节的“ /var/lib/mysql/tc.log”文件即可解决此问题。

すべてのテーブルデータを切り捨ててクリアする

select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where table_schema in ('db1','db2');

検索結果:

+------------------------------------------------------------+
| CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') |
+------------------------------------------------------------+
| truncate TABLE db1.tablename1;                             |
| truncate TABLE db1.tablename2;                             |
| truncate TABLE db1.tablename3;                             |
| truncate TABLE db2.tablename1;                             |
| truncate TABLE db2.tablename2;                             |
| truncate TABLE db2.tablename3;                             |
+------------------------------------------------------------+

フォーマットを整理して実行する

truncate TABLE db1.tablename1;
truncate TABLE db1.tablename2;
truncate TABLE db1.tablename3;
truncate TABLE db2.tablename1;
truncate TABLE db2.tablename2;
truncate TABLE db2.tablename3;

おすすめ

転載: blog.csdn.net/qq_22227087/article/details/82591826