ホーム » MySQL

MySQL」カテゴリーアーカイブ

MySQL インポート時の進捗を知りたい

MySQLDUMPコマンドで取得したダンプをインポートすると進捗が分からない。

[code]
show table status like ‘テーブル名’
[/code]
で確認

MySQL プライマリーキー追加

[code]
ALTER TABLE テーブル名 ADD PRIMARY KEY(項目名)
[/code]

mysqlでエラー1093

mysql 5.7.9を新規に立ち上げmysql 5.1.39上で動作していたシステムを移行したところ

エラー1093が発生
[code]
1093 You can’t specify target table ‘テーブル’ for update in FROM clause UPDATE テーブル SET FD5001 = (SELECT MAX_VAL FROM (SELECT IFNULL(MAX(T1.FD5001), 0) AS MAX_VAL FROM テーブル T1) T) WHERE MESH_NO = ‘999999999’
[/code]

updateの対象テーブルをサブクリーのfromで指定するなという至極まともなエラーだけど、やっぱり今まで動作していたSQLは動作して欲しい!

ということで調べると
my.cnfに以下を追加するとよいとのこと

[code]
optimizer_switch=derived_merge=off
[/code]

記述後mysqlを再起動してもエラーは出っ放し!

show varablesで確認すると設定は正しく反映されている

結局5.7.9をあきらめ5.7.21をインストールした。

5.7.9はこれ以外にも問題が多すぎる

MySQL イベントスケジューラー

MySQLのイベントスケジューラーはバッチ処理やセッション管理に利用可能。

イベントスケジューラーが有効かを確認

[code]
mysql> show variables like ‘%event%’;
+———————————————————-+——-+
| Variable_name | Value |
+———————————————————-+——-+
| binlog_rows_query_log_events | OFF |
| event_scheduler | OFF |
| log_bin_use_v1_row_events | OFF |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_stages_history_size | 10 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_statements_history_size | 10 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_transactions_history_size | 10 |
| performance_schema_events_waits_history_long_size | 10000 |
| performance_schema_events_waits_history_size | 10 |
+———————————————————-+——-+
11 rows in set (0.00 sec)
[/code]

my.cnfのmysqldセクションに以下を記述して再起動

イベント用のクエリを作成し、実行

[code]
CREATE EVENT イベント名
ON SCHEDULE
EVERY 5 MINUTE STARTS ‘2015-06-30 15:00:44’
ON COMPLETION PRESERVE
ENABLE
COMMENT ‘コメント’
DO BEGIN

イベントで行う処理

END
[/code]

MySQL group byでエラー

MySQLのバージョンを5.1.39から5.7.9にあげたら今まで動作していたSQLがエラーになった。

ログを確認すると以下のエラーが出力されていた。

[code]
DB EXECUTE ERR 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘項目名’
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
[/code]

group by した項目以外はselectできないよというエラー。

もちろんそれは正しいが、今まで動作していたSQLは引き続き動作してほしい。

MySQLは5.7からsql_modeにonly_full_group_byが設定されているようだ。

念のためにsql_modeに何が設定されているかを確認。

■バージョン5.1.39の場合
mysql> show variables like ‘sql_mode%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| sql_mode | |
+—————+——-+
1 row in set (0.00 sec)

■バージョン5.7.9の場合
mysql> show variables like ‘sql_mode%’;
+—————+——————————————————————————————————————————————-+
| Variable_name | Value |
+—————+——————————————————————————————————————————————-+
| 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)

my.cnfに以下の記述を追加する。

[code]
sql_mode=”
[/code]

以上でエラーは回避できる

MySQL5.1のDBのダンプをMySQL5.7のDBにインポートしたらSQL エラー (1118): Row size too large (> 8126)

MySQL5.1のDBのダンプをMySQL5.7おDBにインポートしたらSQL エラー (1118): Row size too large (> 8126)が発生した。
特定のテーブルでこのエラーが発生しており、このテーブルではvarcharで定義された項目が400程度もある。
InnoDBではレコードサイズが8192を超えてはだめらしい。
MySQL5.1ではチェックが甘いためか?
このSQLが通っていたがMySQL5.7ではそれがだめになったようだ。
根本的な解決策はQiitaを参照するとして、
今回はとりあえずエラーを回避するためにエラーチェックを緩くする。

確認のために以下のSQLを実行するとエラーが発生。
[code]
create table TESTSIZE
(
FLD01 varchar(12),
FLD02 varchar(12),
省略
FLD298 varchar(12),
FLD299 varchar(12),
FLD300 varchar(12)
)ENGINE=InnoDB
[/code]

その後、以下のコマンドで環境変数を変更してSQLを実行すると警告は表示されるが無事にテーブルは作成される。
[code]
set innodb_strict_mode=0;
[/code]

恒久的な処置としてはmy.cnfに以下を追加
[code]
innodb_strict_mode = 0
[/code]

MySQLを再起動して対応

こちらも参考にさせていただきました
teratail

MySqlDataReaderがハングアップ

.NET Connector6.0.4.0のMySqlDataReaderを10分以上使用しているとハングアップしてしまいエラーも発生せずにCPUをどんどん消費してしまう。

[code]
MySqlCommand my_cmd = my_con.CreateCommand();
my_cmd.CommandText = sql;
MySqlDataReader my_dr = my_cmd.ExecuteReader();
while (my_dr.Read())
{
ここで処理を行う
}
[/code]

上記のwhileが10分以上かかるとReadメソッドでハングアップする。
net_read_timeout、net_read_timeoutそれぞれに3600を設定して回避

MySQLにダンプをインポート

mysql –default-character-set=utf8 -uユーザー名 -pパスワード -h ホスト名 データベース名 < ダンプファイル名

MySQLのストアド、トリガーなどをダンプ

ストアドとトリガーをダンプ
[code]
mysqldump -u ユーザー名 -p -h ホスト名 データベース名 –skip-dump-date –no-create-info –no-data –routines > ダンプファイル名
[/code]

ストアドのみダンプ
[code]
mysqldump -u ユーザー名 -p -h ホスト名 データベース名 –skip-dump-date –no-create-info –no-data –routines –skip-triggers > ダンプファイル名
[/code]

トリガーのみダンプ
[code]
mysqldump -u ユーザー名 -p –triggers –no-create-info –no-data -h ホスト名 データベース名 > ダンプファイル名
[/code]

mysqlを5.7にしたらsql_modeにonly_full_group_byが追加されてエラー

MySQL5.1環境下で作成したシステムをMySQl5.7の環境で実行したら以下のエラーが発生した。
[code]
SELECT list is not in GROUP BY clause and contains nonaggregated column ・・・ with sql_mode=only_full_group_by
[/code]
MySQl5.7からはデフォルトでsql_modeにONLY_FULL_GROUP_BYが設定されるため、SELECTしてよい項目はgroup byの対象項目だけだよということ。
至極当たり前なんだけど、既に動作しているシステムでもあり、修正は考えたくない。
よってONLY_FULL_GROUP_BYをsql_modeから外すことを考える。
最初に現在のsql_modeを確認

[code]
mysql> show variables like ‘sql_mode’;
+—————+——————————————————————————————————————————————-+
| Variable_name | Value |
+—————+——————————————————————————————————————————————-+
| 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)

mysql>
[/code]
※my.cnfにはsql_modeについての記載はない。

よって以下をmy.cnfに記述
[code]
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[/code]

mySQLを再起動して終了