MySQL使用中に発生した問題記録

3898 ワード

ここにいくつかのMySQLを使用する過程で発生した問題と対応する解決方法を記録します。
sqlmode=onlyuフルウ.グループbyグループbyエラーの照会を引き起こす
問題
MySQL実行GROUTP BYクエリエラー:

#1 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this is incompatible with sql_mode=only_full_group_by
解決策

#       sql_mode     
#   MySQL
sudo mysql -hlocalhost -uroot -p123123
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));


MySQLプロファイルを変更して、MySQLサービスを再開することもできます。

#   MySQL    
sudo vim /etc/mysql/conf.d/mysql.cnf
#          
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#     
sudo service mysql restart
詳しく説明する
sqlmodeのデフォルト値は空です。このような設定では、いくつかの不正なデータの挿入を許可するなど、いくつかの不法な操作が可能です。生産環境ではこの値を厳格なモードに設定しなければならないので、環境を開発し、テストするデータベースも設置しなければならない。sqlmodeの常用値は以下の通りです。
ONLYFULL_GROUT_BY:GROUT BYの集約操作について、SELECTの中の列がGROUT BYに現れていない場合、このSQLは合法的ではないです。
NOの_AUTO_VALE_ONするゼロ:この値は成長列からの挿入に影響します。デフォルト設定では、0またはNULLを挿入すると次の自己成長値が生成されます。ユーザーが希望する値が0であり、列が自己成長である場合、このオプションが有効になります。
STRICT_TRANS_TABLES:このモードで、一つの値が一つの事務表に挿入できない場合、現在の操作を中断し、非事務表に対して制限をしない。
NOの_ゼロガスIN_DATE:厳格なモードでは、日付と月はゼロにしてはいけません。
NOの_ゼロガスDATE:この値を設定すると、mysqlデータベースはゼロの日付を挿入できません。ゼロの日付を挿入すると警告ではなくエラーが発生します。
ERROR_FORDIVISION_BY_ZERO:INSERTまたはUPDATE中にデータがゼロになったら警告ではなくエラーが発生します。このモードが与えられていない場合、データがゼロになると、MySQLはNULLに戻る。
NOの_AUTO_CREATE_USER:GRANTのパスワードが空のユーザの作成を禁止します。
NOの_ENGINESUBSTITURTION:必要なストレージエンジンが無効またはコンパイルされていない場合、エラーをスローします。この値を設定しない場合は、デフォルトの格納エンジンで置換し、異常をスローします。
PIPES_ASCONCAT:「𞓜𞓜」を文字列の接続オペレータとして扱う。これはOracleデータベースと同じで、文字列の連結関数Concatと同様である。
ANSI_QUOTES:ANSI_を有効にしますQUOTES後は、文字列を二重引用符で引用することはできません。識別子と解釈されます。
テーブルデータをクリア
問題
データの移動やデータの修復を行う場合、データテーブルをクリアしてデータテーブルをリセットする必要があります。
ソリューション
TRUNCATE TABLEテーブルを使用できます。nameコマンドはデータテーブルをリセットします。このコマンドの本質は表を削除してからテーブルを再構築します。制約のあるテーブルでは実行できません。外部キー制約を無効にしてから削除を実行しなければなりません。
もう一つの方法は、表の中のすべてのデータを削除して、表のid開始値を1に設定することです。

#      
SELECT @@FOREIGN_KEY_CHECKS;  #           
SET FOREIGN_KEY_CHECKS=0;  #         
TRUNCATE TABLE table_name;  #      
 
#      ,  
DELETE FROM table_name;  #   where             
ALTER TABLE table_name AUTO_INCREMENT=1; #        
MySQL占有メモリが大きすぎます。
サーバーメモリが1 G以下の場合は、MySQLのデフォルトの設定を変更する必要があります。そうでないと、あなたのMySQLが400 Mまたは800 Mのメモリを簡単に占有していることが分かります。
MySQLの構成を最適化することにより、メモリの占有を低減する目的を達成しました。構成ファイルは一般的にvim/etc/my.cnfにあります。  の[mysqld]の下にあります。詳細なMySQLの設定は、公式サイト:MySQL公式サイトの詳細な構成項目を参照することができます。前のサーバーはシングルCPUで、メモリは1 Gです。

# The maximum number of instrumented table objects.         ,  -1   
performance_schema_max_table_instances = 600
# The number of table definitions that can be stored in the definition cache,  -1   
table_definition_cache = 400 
# The number of open tables for all threads.             ,   2000 
table_open_cache = 128 
# innodb       ,      ,   
innodb_buffer_pool_size = 600M 
#                 ,     
join_buffer_size = 8M
設定を変更した後、mysqlサービスを再起動して、設定項目が有効になりました。
現在のmysqlの配置情報は以下のように調べられます。

#   mysql
mysql -hlocalhost -uroot -ppassword
#         
show global variables;
#         
show global status;
#         ,      innodb      
show global variables like 'innodb%';
MySQL臨時表は別名が必要です。
クエリによって生成された一時テーブルは、asを使用してエイリアスを定義しなければならない。エラーが発生します。Every devid table must have its own alias。
MySQL取得テーブルの列名
テーブルの名前をテーブルにする。nameこのテーブルの列名は、次の3つのコマンドで照会できます。

DESC table_name;

DESCRIBE table_name;

SHOW columns FROM persons;