揮発性のメモ2

知識をメモ書きしておく

MySQLで、データベースをダンプする

ダンプ

普通のダンプ。 ストアドプロシージャもトリガーもビューも無いとき

mysqldump -uUSER -pPASS DBNAME --single-transaction | gzip > DB.sql.gz

トリガー以外をダンプ。データは出力する。 BLOBは16進表記にする。定義者は消す

mysqldump -uUSER -pPASS DBNAME --single-transaction -R --hex-blob --skip-triggers \
    | sed 's/DEFINER=[^*]*\*/\*/g' \
    | gzip > DB.sql.gz

トリガーだけダンプ。データは出力しない。 定義者は消す

mysqldump -uUSER -pPASS DBNAME --single-transaction -d -t \
    | sed 's/DEFINER=[^*]*\*/\*/g' \
    | gzip > DB-TRIGGERONLY.sql.gz
オプション 内容
--single-transaction テーブルロックをせず、トランザクションを使って一貫性を保つ
--hex-blob BLOB型を16進でダンプして文字化けさせない。そのままINSERTできる
-R, --routines ストアドプロシージャ、ファンクションを出力する(デフォルトは出力しない)
--skip-triggers トリガーを出力しない(デフォルトは出力する)
-d, --no-data データを出力しない
-t, --no-create-info テーブルとビューの定義を出力しない
  • --opt はデフォルトで有効だが これには --lock-tables が含まれている。が、--single-transaction を指定することでテーブルロックは無効化されるので安心
  • --hex-blob でダンプしても普通にinsertできるので安心
  • ビューとかトリガーには /*!50017 DEFINER=`USER`@`localhost`*/ のような定義者の定義が付く。これは別DBでユーザ名が変わったりしたときにすげー邪魔なので DEFINER=`USER`@`localhost` を削除する
DROP TABLE IF EXISTS
CREATE TABLE ...
INSERT INTO ...
CREATE TRIGGER ...

の順になるので、トリガーが発動する心配はない。(少し前まで勘違いして心配してた)


トリガーの確認

MariaDB [dbhoge]> select TRIGGER_NAME,EVENT_OBJECT_TABLE,EVENT_MANIPULATION,ACTION_TIMING 
    -> from information_schema.TRIGGERS where TRIGGER_SCHEMA='dbhoge';
+--------------+--------------------+--------------------+---------------+
| TRIGGER_NAME | EVENT_OBJECT_TABLE | EVENT_MANIPULATION | ACTION_TIMING |
+--------------+--------------------+--------------------+---------------+
| add_data     | kakaku_table       | INSERT             | AFTER         |
| move_data    | kakaku_table       | UPDATE             | AFTER         |
+--------------+--------------------+--------------------+---------------+
カラム名 内容
TRIGGER_NAME トリガーの名前
EVENT_OBJECT_TABLE トリガーになるテーブル
EVENT_MANIPULATION 契機
ACTION_TIMING 実行されるタイミング

ストアドプロシージャ、ファンクションの確認

MariaDB [dbhoge]> select ROUTINE_NAME,ROUTINE_TYPE,DTD_IDENTIFIER 
    -> from information_schema.ROUTINES where ROUTINE_SCHEMA='dbname';
+--------------+--------------+----------------+
| ROUTINE_NAME | ROUTINE_TYPE | DTD_IDENTIFIER |
+--------------+--------------+----------------+
| log_insert   | PROCEDURE    | NULL           |
| get_kakaku   | FUNCTION     | DECIMAL(10,2)  |
| get_stat     | FUNCTION     | VARCHAR(20)    |
+--------------+--------------+----------------+
カラム名 内容
ROUTINE_NAME 名前
ROUTINE_TYPE 種類
DTD_IDENTIFIER 戻り値


参考
dev.mysql.com
journal.lampetty.net
stackoverflow.com