MySQLとの暮らしに役立ちたいリンク集


# タイムアウト

```sql:いろんなタイムアウトを確認する
show global variables like '%timeout%';
```

|Variable_name|値|意味|参考URL|
|:--|:--|:--|:--|
|aurora_fwd_master_idle_timeout|秒|プライマリクラスターがセカンダリクラスターから転送された接続でアクティビティを終了するまで待機する秒数。この期間を超えてセッションがアイドル状態のままである場合、Aurora はセッションをキャンセルします。|[Amazon Aurora Global Database の書き込み転送を使用する - Amazon Aurora](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-write-forwarding.html)|
|aurora_globaldb_rpo_wait_timeout||||
|aurora_zdr_timeout_on_replica_fall_behind||||
|connect_timeout||MySQLがクライアントからの接続パケットを待機する時間|[第75回　MySQLのさまざまなタイムアウトオプションについて | gihyo.jp](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0075)|
|delayed_insert_timeout||(MySQL5.6.7以降非推奨)終了する前に、INSERT DELAYED ハンドラスレッドが INSERT ステートメントを待機する秒数。|[MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数](https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_delayed_insert_timeout)|
|have_statement_timeout|Boolean|ステートメントの実行タイムアウト機能が使用可能かどうか|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.1.8 サーバーシステム変数](https://dev.mysql.com/doc/refman/8.0/ja/server-system-variables.html)|
|innodb_flush_log_at_timeout|秒|ログを N 秒ごとに書き込んで、フラッシュする|[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数](https://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html#sysvar_innodb_flush_log_at_timeout)|
|innodb_lock_wait_timeout|秒|行ロックが解除されるまで InnoDB トランザクションが待機する時間|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.14 InnoDB の起動オプションおよびシステム変数](https://dev.mysql.com/doc/refman/8.0/ja/innodb-parameters.html#sysvar_innodb_lock_wait_timeout)|
|innodb_rollback_on_timeout|Boolean|InnoDB rolls back では、トランザクションタイムアウトの最後のステートメントのみがデフォルトで実行|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.14 InnoDB の起動オプションおよびシステム変数](https://dev.mysql.com/doc/refman/8.0/ja/innodb-parameters.html#sysvar_innodb_rollback_on_timeout)|
|lock_wait_timeout|秒|メタデータロックを取得するための待機時間|[第75回　MySQLのさまざまなタイムアウトオプションについて | gihyo.jp](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0075#sec2_h2)|
|net_read_timeout|秒|読み取りを中止する前に接続からのデータを待機する秒数|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.1.8 サーバーシステム変数](https://dev.mysql.com/doc/refman/8.0/ja/server-system-variables.html)|
|net_write_timeout|秒|書き込みを中止する前にブロックが接続に書き込まれるのを待機する秒数|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.1.8 サーバーシステム変数](https://dev.mysql.com/doc/refman/8.0/ja/server-system-variables.html)|
|rpl_stop_slave_timeout|秒|タイムアウトまでに STOP SLAVE が待機する時間|[MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.1.4.3 レプリケーションスレーブのオプションと変数](https://dev.mysql.com/doc/refman/5.6/ja/replication-options-slave.html)|
|slave_net_timeout|秒|マスター/スレーブ接続から後続のデータを待機する秒数 (これ以降は、読み取りを中止)|[MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.1.4.3 レプリケーションスレーブのオプションと変数](https://dev.mysql.com/doc/refman/5.6/ja/replication-options-slave.html)|
|interactive_timeout|秒|対話型の接続に対してのアイドルタイムアウト時間|[第75回　MySQLのさまざまなタイムアウトオプションについて | gihyo.jp](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0075#sec1_h3)|
|wait_timeout|秒|非対話型の接続に対してのアイドルタイムアウト時間|[MySQL の wait_timeout デフォルト値のワナ（接続モードによる値の違い） - Qiita](https://qiita.com/yut_h1979/items/cb12749e23478f45a939)|



# ダンプファイルを〇〇したい

```bash
# 特定のデータベースのダンプを取りたい(GitBashでは対話ができないので「-pパスワード」を指定して実行する)
$ mysqldump --single-transaction -u {ユーザ名} {データベース} -p > {ダンプファイル}.dmp
# 特定のデータベースのダンプを入れたい(リストア)
$ mysql -u {ユーザ名} -D {データベース} -p < {ダンプファイル}.dmp
```


|mysqldumpのオプション|意味|参考リンク|
|:--|:--|:--|
|--all-databases<br/>-A|すべてのテーブルをダンプする|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html)|
|--databases {データベース1} {データベース2}<br/>-B|複数のデータベースをダンプする<br/>1つだけの場合は`mysqldump {オプション} {データベース}`でOK|[--databases :: MySQL 8.0 リファレンスマニュアル](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html#option_mysqldump_databases)|
|--no-data<br/>-d|テーブルの行情報を書き出さない|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html)|
|--skip-column-statistics|ANALYZE TABLE文の自動生成をしない(MySQL8未満用)|[mysqldumpコマンドで &quot;Unknown table &#39;COLUMN_STATISTICS&#39; in information_schema (1109)&quot; と怒られる原因と対策 - モヒカンメモ](https://blog.pinkumohikan.com/entry/mysqldump-disable-column-statistics)|
|--set-gtid-purged={AUTO/OFF/ON/COMMENTED}|SET @@GLOBAL.GTID_PURGED を出力に追加するかどうか|[MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html)|


- [MySQLのデータベースをmysqldumpでバックアップ/復元する方法 | WEB ARCH LABO](https://weblabo.oscasierra.net/mysql-mysqldump-01/)
- [mysqldumpでバックアップ・リストアする - とほほのWWW入門](http://www.tohoho-web.com/ex/mysql-mysqldump.html)
- [MySQLの覚書 | MySQLのコマンド](http://amaraimusi.sakura.ne.jp/note_prg/mysql/cmd_note.html)










































# 設定ファイル
- [MySQLにおけるテーブル名の大文字／小文字区別について - REDOLOG](https://wd3ie.hatenadiary.org/entry/20110309/1299647373)
- [MySQLのtime_zoneを設定する方法 - Qiita](https://qiita.com/ponsuke0531/items/8fbd1a918809c18f35d6)

```sql
-- 大文字小文字の設定を確認したい
show variables where variable_name='lower_case_table_names';
-- タイムゾーンを確認したい
show variables like '%time_zone%';
```

- 設定ファイルが読み込まれる順序
    - [MySQL :: MySQL 8.0 Reference Manual :: 4.2.2.2 Using Option Files](https://dev.mysql.com/doc/refman/8.0/en/option-files.html)

|順番|Windows|Unix系|
|:-:|:-:|:-:|
|1|%WINDIR%\my.ini, %WINDIR%\my.cnf|/etc/my.cnf|
|2|C:\my.ini, C:\my.cnf|/etc/mysql/my.cnf|
|3|BASEDIR\my.ini, BASEDIR\my.cnf|SYSCONFDIR/my.cnf|
|4|-|$MYSQL_HOME/my.cnf|
|5|defaults-extra-file|defaults-extra-file|
|6|-|~/.my.cnf|
|7|%APPDATA%\MySQL\.mylogin.cnf|~/.mylogin.cnf|
|8|DATADIR\mysqld-auto.cnf|DATADIR/mysqld-auto.cnf|




















































# SQL
- [MySQLでNOT INの代わりにNOT EXISTSを使うと速い&#65372;楽しけりゃ何でもいいや](http://rzpg.blogspot.com/2011/02/mysqlnot-innot-exists.html)

## INSERT
```sql
-- カラムを指定して複数レコードをinsert(Djangoでテーブルを作るとmodels.pyでの定義と順番が変わっちゃうのでこの方法が便利です)
INSERT INTO テーブル (カラム1, カラム2, カラム3)
VALUES 
  (値1, 値2, 値3),
  (値1, 値2, 値3),
  (値1, 値2, 値3);
```

> AUTO_INCREMENT制約が付いているカラムは0あるいはNULLを設定することで自動的に連番の値を設定することができます。
> [MySQLでデータを追加する「INSERT」 | UX MILK](https://uxmilk.jp/51311)

- [MySQLのDATE型にINSERTできる日付フォーマット | レコチョクのエンジニアブログ](https://techblog.recochoku.jp/5816)



## 削除

```sql
-- VIEWの削除
DROP VIEW IF EXISTS ビュー
-- カラムの削除
ALTER TABLE テーブル DROP COLUMN カラム
---------------------------------
-- 制約の削除
---------------------------------
-- 主キー
ALTER TABLE テーブル DROP PRIMARY KEY CASCADE;
-- 一意制約
ALTER TABLE テーブル DROP UNIQUE カラム CASCADE;
-- 制約名で削除する
ALTER TABLE テーブル DROP CONSTRAINT 制約名 CASCADE;
```

- CASCADE句 : 削除する整合性制約に依存するほかの整合性制約(外部キーなど)もすべて削除する
- 主キーになっているカラムを削除する
    1. CASCADE句をつけて主キー制約の削除
    2. カラムの削除
    3. 新しい主キー制約の作成



## 日時
|データ型|「ゼロ」値|
|:--|:--|
|DATE|'0000-00-00'|
|TIME|'00:00:00'|
|DATETIME|'0000-00-00 00:00:00'|
|TIMESTAMP|'0000-00-00 00:00:00'|
|YEAR|0000|

上記表の出典は、[MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3 日付と時間型](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-types.html)

|date_format<br/>の指定子|説明|
|:--|:--|
|%Y|4桁年|
|%y|2桁年|
|%M|月名(January..December)|
|%c|月(0..12)|
|%m|月(00..12)|
|%d|日(00..31)|
|%e|日(0..31)|

```sql
/* date型のカラムを月でgroup byしたい */
select date_format(date_col, '%y-%m'), count(*) from table_name group by date_format(date_col, '%y%m');
```

- [MySQL DATETIME型のミリ秒の扱いについて | データベース | DoRuby](https://doruby.jp/users/ap_tg/entries/MySQL_DATETIME_)
- [MySQLで月別、日別、時間、曜日別にレコード数を集計する方法 - おおらかにいこう](http://fuminori14.hatenablog.com/entry/2012/11/30/101816)
- [DATE_FORMAT関数 / TIME_FORMAT関数 (日付または時刻を指定したフォーマットで整形する) | MySQLの使い方](https://www.dbonline.jp/mysql/function/index49.html)

# インストールしたい
- [Windows10にインストーラーでMySQLをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/176a158ea4db3714adda)
- [Windows10にzipでMySQLをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/1db8183c0c5b971307c2)
- [RDSでMySQLを作ってみる - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2020/02/19/204649)
- [Ubuntuにmysqlコマンドをインストールする - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2020/02/27/214335)
- [mysqlコマンドをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/3ae69a9d477809c00917)

# ログインしたい

```bash
# 起動
$ mysql.server start

# ログインしたい
$ mysql -h {ホスト} -u {ユーザー} -P {ポート} -D {データベース} -p
# GitBashでログインしたい
$ winpty mysql -h {ホスト} -u {ユーザー} -P {ポート} -D {データベース} -p
# ログインしたい(PWがない場合)
$ mysql -u root
# RDSにログインしたい
$ mysql -h {エンドポイント} -P 3306 -u {ユーザ} -p
```


# データベースの情報が見たい
```sql
------------------------
-- データベース
------------------------
-- 一覧を見たい
show databases;
-- 現在使ってるのデータベースを見たい
select database();
-- 設定できる文字セットと照合順序をみたい
show character set;
------------------------
-- ユーザー
------------------------
-- 一覧を見たい
select host,user,account_locked from mysql.user;
-- 現在使ってる(ログイン中)のユーザーを見たい
select user();
------------------------
-- テーブルを検索
------------------------
-- テーブル名で検索
select * from information_schema.tables where table_schema = 'スキーマ名' and table_name like '%テーブル名の一部%';
-- 特定のカラム名のカラムがあるテーブル(viewは除く)の一覧を見たい
select table_name from information_schema.columns where table_schema = {スキーマ名} and column_name = {カラム名} and table_name in (select table_name from information_schema.tables where table_schema = {スキーマ名} and table_type = 'BASE TABLE');
-- 特定のカラム名のカラムがないテーブル(viewは除く)の一覧を見たい
select table_name from information_schema.tables where table_schema = {スキーマ名} and table_type = 'BASE TABLE' and table_name not in (select table_name from information_schema.columns where table_schema = {スキーマ名} and column_name = {カラム名});
------------------------
-- カラムを検索
------------------------
select * from information_schema.columns where table_schema = 'スキーマ名' and table_name = 'テーブル名' and column_name like '%カラム名の一部%';
------------------------
-- 制約を検索
------------------------
select * from information_schema.table_constraints where table_schema = 'スキーマ名' and table_name = 'テーブル名' and constraint_name like '%制約名の一部%';
```

- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.2 MySQL での文字セットと照合順序](https://dev.mysql.com/doc/refman/5.6/ja/charset-mysql.html)
- [MySQLでinformation_schemaから外部キー参照を確認する時のメモ - Qiita](https://qiita.com/a-nishimura/items/1cf7df851c79b29d2b00)
- [MySQLでユニークキーや外部キーを確認する - Qiita](https://qiita.com/expajp/items/81a8773b49472925fe06)

# ○○を作りたい
```sql
-- データベースを作りたい
create database [if not exists] {データベース名} [character set {文字セット} collate {照合順序}];
create database if not exists ponsuke_db character set utf8 collate utf8_general_ci;
-- ユーザーを作りたい
create user 'ユーザー名'@'localhost' identified by 'パスワード';
grant all privileges on データベース名.* to 'ユーザー名'@'localhost' identified by 'パスワード';
```

> - _ci で終わる名前は大文字と小文字を区別しない照合順序を示します。
> - _cs で終わる名前は、大文字と小文字を区別する照合順序を示します。
> - _bin で終わる名前はバイナリ照合順序を示します。文字の比較は、文字バイナリコード値に従って行われます。
> [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.7.1 照合順序名](https://dev.mysql.com/doc/refman/5.6/ja/charset-collation-names.html)

- [ユーザーのロックと解除 | MySQLの使い方](https://www.dbonline.jp/mysql/user/index12.html)
- [MySQLのコンテナを作る方法 - Qiita](https://qiita.com/ponsuke0531/items/cbd5f3fe9461792c2279)
- [ある列の値だけを変えてレコードをコピーしたい - Qiita](https://qiita.com/amay077/items/ba27030e7009c16971ee)






















































# クライアントツール
- Sequel Pro
    - 選択中のクエリをSQL実行 : `Command + R`
    - [MySQLクライアントソフトSequelProで便利なキーボードショートカット集 - Qiita](https://qiita.com/endam/items/e1073f18b3090c902812)
- MySQL Workbench
    - [拡張子MWBファイルを開く方法 - Qiita](https://qiita.com/ponsuke0531/items/599cbb57aae0eb114321)




# データベース全般
- [DBと仲良くしたいときに役立つリンク集 - Qiita](https://qiita.com/ponsuke0531/items/f34d60e514dde47e81df)



















# 困った
- [サービスに登録したMySQLが停止しなくなったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/ee4ca51fbd654d3703d8)
- [ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES) - Qiita](https://qiita.com/ponsuke0531/items/df51a784b5ff48c97ac7)
- [ERROR 1267 (HY000): Illegal mix of collations - Qiita](https://qiita.com/ponsuke0531/items/52f5588ef4b69d73a1a6)
- [ERROR 2003 (HY000): Can't connect to MySQL server on - Qiita](https://qiita.com/ponsuke0531/items/1cd76d53c1672fd81d03)
- [MySQLのコンテナを作成したのに再起動し続ける - Qiita](https://qiita.com/ponsuke0531/items/973b4beecd99ba23ce66)
- [stdin is not a tty - Qiita](https://qiita.com/ponsuke0531/items/060c6a013f43286de3c0)