知らないかもしれないmysqldumpパラメータ

知らないかもしれないmysqldumpパラメータ

前回の記事で、mysqldump バックアップ ファイルに記録されるタイムスタンプ データは UTC タイム ゾーンに基づいていることを説明しました。単一のデータベースまたはテーブルを選択して復元する場合は、タイム ゾーンの違いに注意してください。その後、再度ドキュメントを確認したところ、tz-utc と skip-tz-utc パラメータがこれに関係していることがわかりました。この記事では、これらのパラメータの役割について見ていきましょう。

1. tz-utc および skip-tz-utc パラメータの概要

これら 2 つのパラメータは、mysqldump バックアップ プロセスで使用でき、互いに反対の意味を持ちます。名前が示すように、1 つのパラメーターはタイムスタンプを UTC タイムゾーンに変更し、もう 1 つはタイムゾーンの変更をスキップします。

mysql サーバーで mysqldump --help コマンドを実行すると、次の段落が表示されます。

[root@host ~]# mysqldump --help
mysqldump Ver 10.13 Distrib 5.7.23、Linux (x86_64) 用
Copyright (c) 2000, 2018, Oracle およびその関連会社。無断複写・転載を禁じます。
...多くのコンテンツを省略 --tz-utc ダンプの先頭に SET TIME_ZONE='+00:00' を設定して、
           サーバーが異なる時刻のデータを持っている場合のTIMESTAMPデータ
           ゾーンまたはデータがサーバー間で移動されている
           異なるタイムゾーン。
           (デフォルトではオンになっています。無効にするには --skip-tz-utc を使用してください。)

--tz-utc パラメータは mysqldump のデフォルト パラメータで、mysqldump エクスポート ファイルの先頭にタイム ゾーンを設定するための SET TIME_ZONE='+00:00' ステートメントを追加します。このタイム ゾーンはグリニッジ標準時で、0 タイム ゾーンです。このように、タイムスタンプ フィールドがエクスポートされると、サーバーによって設定された現在のタイム ゾーンで表示されるタイムスタンプの時刻値が、グリニッジ標準時で表示される時刻に変換されます。たとえば、データベースは北京タイムゾーン 8 を使用しており、mysqldump によってエクスポートされたファイルに表示されるタイムスタンプ値は、データベース クエリによって表示される時間と比較して 8 時間前になります。

--tz-utc がわかれば、--skip-tz-utc の意味は、mysqldump がデータをエクスポートするときにグリニッジ標準時を使用せず、現在の MySQL サーバーのタイムゾーンを使用してエクスポートするということです。このように、エクスポートされたデータに表示されるタイムスタンプの時間値は、テーブルでクエリされた時間値と同じになります。

2. 実験パラメータの特定の効果

このパラメータの効果をよりよく理解するために、具体的なテストを行ってみましょう。mysqldump を where 条件とともに使用してデータをバックアップできることはわかっています。タイムスタンプ フィールドに基づいてデータをバックアップすると、パラメータに何らかの影響があるでしょうか?一緒に検証してみましょう:

まず、環境設定とテスト データを見てみましょう。

mysql> バージョンを選択します();
+------------+
| バージョン() |
+------------+
| 5.7.23-ログ |
+------------+
セット内の 1 行 (0.00 秒)
# タイムゾーンは北京タイムゾーン 8 です。mysql> show variables like 'time_zone'; 
+---------------+--------+
| 変数名 | 値 |
+---------------+--------+
| タイムゾーン | +08:00 |
+---------------+--------+
セット内の 1 行 (0.00 秒)

# テスト テーブルには、datetime フィールドと timestamp フィールドに 10 個のデータがあります。2 つの時刻は同じに表示されます。mysql> show create table test_tb\G
************************** 1. 行 ****************************
    テーブル: test_tb
テーブルの作成: CREATE TABLE `test_tb` (
 `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
 `stu_id` int(11) NOT NULL COMMENT '学生ID',
 `stu_name` varchar(20) デフォルト NULL コメント '学生名',
 `dt_time` 日時 NOT NULL、
 `create_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成時刻',
 主キー (`increment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='テストテーブル'
セット内の 1 行 (0.00 秒)

mysql> test_tb から * を選択します。
+--------------+--------+----------+----------------------+----------------------+
| increment_id | stu_id | stu_name | dt_time | create_time |
+--------------+--------+----------+----------------------+----------------------+
| 1 | 1001 | fgds | 2020-07-10 09:43:28 | 2020-07-10 09:43:28 |
| 2 | 1002 | fgsw | 2020-10-10 09:43:28 | 2020-10-10 09:43:28 |
| 3 | 1003 | vffg | 2020-10-10 02:00:00 | 2020-10-10 02:00:00 |
| 4 | 1004 | wdsd | 2020-10-31 23:43:28 | 2020-10-31 23:43:28 |
| 5 | 1005 | grdb | 2020-11-01 00:00:00 | 2020-11-01 00:00:00 |
| 6 | 1006 | sdfv | 2020-11-01 02:00:00 | 2020-11-01 02:00:00 |
| 7 | 1007 | fgfg | 2020-11-06 02:00:00 | 2020-11-06 02:00:00 |
| 8 | 1008 | tyth | 2020-11-10 09:43:28 | 2020-11-10 09:43:28 |
| 9 | 1009 | ewer | 2020-11-10 09:43:28 | 2020-11-10 09:43:28 |
| 10 | 1010 | エラー | 2020-11-11 15:17:03 | 2020-11-11 15:17:03 |
+--------------+--------+----------+----------------------+----------------------+

デフォルトでは、mysqldump は tz-utc をオンにします。まずはデフォルトでのバックアップ結果を見てみましょう。

# 結果をより明確にするために、skip-extended-insert を使用してデータを行ごとに表示します # 完全なデータベース バックアップ [root@host ~]# mysqldump -uroot -pxxxx --skip-extended-insert --databases testdb > utc_testdb.sql
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
[root@host ~]# utc_testdb.sql の詳細 
-- MySQL ダンプ 10.13 Distrib 5.7.23、Linux (x86_64) 用
--
-- ホスト: localhost データベース: testdb
-- ------------------------------------------------------
--サーバーバージョン 5.7.23-ログ

... /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */ を省略;
/*!40103 TIME_ZONE='+00:00' を設定します */;
# まず古いタイムゾーンを保存し、次にこのセッションのタイムゾーンを 0 タイムゾーンに変更します...省略--
-- テーブル `test_tb` のデータをダンプしています
--

LOCK TABLES `test_tb` WRITE;
/*!40000 ALTER TABLE `test_tb` でキーを無効にする */;
`test_tb` に値 (1,1001、'fgds'、'2020-07-10 09:43:28'、'2020-07-10 01:43:28') を挿入します。
`test_tb` に値 (2,1002、'fgsw'、'2020-10-10 09:43:28'、'2020-10-10 01:43:28') を挿入します。
`test_tb` に値 (3,1003、'vffg'、'2020-10-10 02:00:00'、'2020-10-09 18:00:00') を挿入します。
`test_tb` に値 (4,1004、'wdsd'、'2020-10-31 23:43:28'、'2020-10-31 15:43:28') を挿入します。
`test_tb` に値 (5,1005、'grdb'、'2020-11-01 00:00:00'、'2020-10-31 16:00:00') を挿入します。
`test_tb` に値 (6,1006、'sdfv'、'2020-11-01 02:00:00'、'2020-10-31 18:00:00') を挿入します。
`test_tb` に値 (7,1007、'fgfg'、'2020-11-06 02:00:00'、'2020-11-05 18:00:00') を挿入します。
`test_tb` に値 (8,1008、'tyth'、'2020-11-10 09:43:28'、'2020-11-10 01:43:28') を挿入します。
`test_tb` に値 (9,1009、'ewer'、'2020-11-10 09:43:28'、'2020-11-10 01:43:28') を挿入します。
`test_tb` に値 (10,1010,'erre','2020-11-11 15:17:03','2020-11-11 07:17:03') を挿入します。
# タイムスタンプの時刻値は 8 時間減算されますが、日付時刻の時刻値は変更されないままであることがわかります UNLOCK TABLES;
/*!40103 TIME_ZONE=@OLD_TIME_ZONE を設定します */;
# タイムゾーンを元のタイムゾーンに変更します /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-- ダンプは 2020-11-11 15:34:21 に完了しました

# where 条件を使用して、単一のテーブル内の部分的なデータをバックアップし、11 月以降のデータをバックアップします。# データベースでクエリを実行します。mysql> select * from test_tb where create_time >= '2020-11-01 00:00:00';
+--------------+--------+----------+----------------------+----------------------+
| increment_id | stu_id | stu_name | dt_time | create_time |
+--------------+--------+----------+----------------------+----------------------+
| 5 | 1005 | grdb | 2020-11-01 00:00:00 | 2020-11-01 00:00:00 |
| 6 | 1006 | sdfv | 2020-11-01 02:00:00 | 2020-11-01 02:00:00 |
| 7 | 1007 | fgfg | 2020-11-06 02:00:00 | 2020-11-06 02:00:00 |
| 8 | 1008 | tyth | 2020-11-10 09:43:28 | 2020-11-10 09:43:28 |
| 9 | 1009 | ewer | 2020-11-10 09:43:28 | 2020-11-10 09:43:28 |
| 10 | 1010 | エラー | 2020-11-11 15:17:03 | 2020-11-11 15:17:03 |
+--------------+--------+----------+----------------------+----------------------+
セット内の 6 行 (0.00 秒)
# mysqldump エクスポート [root@host ~]# mysqldump -uroot -pxxxx --skip-extended-insert testdb test_tb --where "create_time >= '2020-11-01 00:00:00' " > utc_testdb2.sql
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
[root@host ~]# utc_testdb2.sql の詳細 
-- MySQL ダンプ 10.13 Distrib 5.7.23、Linux (x86_64) 用
--
-- ホスト: localhost データベース: testdb
-- ------------------------------------------------------
--サーバーバージョン 5.7.23-ログ
...
/*!40103 @OLD_TIME_ZONE=@@TIME_ZONE を設定します */;
/*!40103 TIME_ZONE='+00:00' を設定します */;
...省略 - 
-- テーブル `test_tb` のデータをダンプしています
--
-- 場所: create_time >= '2020-11-01 00:00:00' 

LOCK TABLES `test_tb` WRITE;
/*!40000 ALTER TABLE `test_tb` でキーを無効にする */;
`test_tb` に値 (7,1007、'fgfg'、'2020-11-06 02:00:00'、'2020-11-05 18:00:00') を挿入します。
`test_tb` に値 (8,1008、'tyth'、'2020-11-10 09:43:28'、'2020-11-10 01:43:28') を挿入します。
`test_tb` に値 (9,1009、'ewer'、'2020-11-10 09:43:28'、'2020-11-10 01:43:28') を挿入します。
`test_tb` に値 (10,1010,'erre','2020-11-11 15:17:03','2020-11-11 07:17:03') を挿入します。
# エクスポートできる UNLOCK TABLES は 4 つだけ見つかりました。
/*!40103 TIME_ZONE=@OLD_TIME_ZONE を設定します */;

-- ダンプは 2020-11-11 15:58:56 に完了しました

上記のエクスポートされた結果をよく見てみることをお勧めします。正直なところ、これまで詳細なテストを行ったことがなく、今の結果を見て少し驚いています。デフォルトでは、データは問題ありません。タイムスタンプ値は 0 タイムゾーンに変換されますが、データベースをインポートすると、データベースのタイムゾーンで表示されます。しかし、where 条件を使用してデータの一部をエクスポートすると、データベースクエリから取得された結果が dump でエクスポートされた結果と異なっていました。このとき、mysqldump は 0 タイムゾーンに変換後の時間値が where 条件に合致するデータのみをエクスポートし、直接クエリで取得された結果とは異なっていました。これは、これまで気づかなかったことです。

--skip-tz-utc パラメータを見て、期待どおりかどうか確認してみましょう。

# skip-tz-utc フルバックアップを使用 [root@host ~]# mysqldump -uroot -pxxxx --skip-extended-insert --skip-tz-utc --databases testdb > skiputc_testdb.sql
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
[root@host ~]# skiputc_testdb.sql をさらに実行 
-- MySQL ダンプ 10.13 Distrib 5.7.23、Linux (x86_64) 用
--
-- ホスト: localhost データベース: testdb
-- ------------------------------------------------------
--サーバーバージョン 5.7.23-ログ
..省略された見えないタイムゾーン変更ステートメント--
-- テーブル `test_tb` のデータをダンプしています
--

LOCK TABLES `test_tb` WRITE;
/*!40000 ALTER TABLE `test_tb` でキーを無効にする */;
`test_tb` に値 (1,1001,'fgds','2020-07-10 09:43:28','2020-07-10 09:43:28') を挿入します。
`test_tb` に値 (2,1002、'fgsw'、'2020-10-10 09:43:28'、'2020-10-10 09:43:28') を挿入します。
`test_tb` に値 (3,1003,'vffg','2020-10-10 02:00:00','2020-10-10 02:00:00') を挿入します。
`test_tb` に値 (4,1004、'wdsd'、'2020-10-31 23:43:28'、'2020-10-31 23:43:28') を挿入します。
`test_tb` に値 (5,1005、'grdb'、'2020-11-01 00:00:00'、'2020-11-01 00:00:00') を挿入します。
`test_tb` に値 (6,1006、'sdfv'、'2020-11-01 02:00:00'、'2020-11-01 02:00:00') を挿入します。
`test_tb` に値 (7,1007,'fgfg','2020-11-06 02:00:00','2020-11-06 02:00:00') を挿入します。
`test_tb` に値 (8,1008、'tyth'、'2020-11-10 09:43:28'、'2020-11-10 09:43:28') を挿入します。
`test_tb` に値 (9,1009、'ewer'、'2020-11-10 09:43:28'、'2020-11-10 09:43:28') を挿入します。
`test_tb` に値 (10,1010,'erre','2020-11-11 15:17:03','2020-11-11 15:17:03') を挿入します。
# タイムスタンプ値は変換されずに日付時刻値と同じように表示されます。UNLOCK TABLES;
-- ダンプは 2020-11-11 16:23:32 に完了しました

# skip-tz-utc を使用して一部のデータをバックアップします [root@host ~]# mysqldump -uroot -pxxxx --skip-extended-insert --skip-tz-utc testdb test_tb --where "create_time >= '2020-11-01 00:00:00' " > skiputc_testdb2.sql
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
[root@host ~]# skiputc_testdb2.sql をさらに実行 
-- MySQL ダンプ 10.13 Distrib 5.7.23、Linux (x86_64) 用
--
-- ホスト: localhost データベース: testdb
-- ------------------------------------------------------
--サーバーバージョン 5.7.23-ログ
.. 省略 - 
-- テーブル `test_tb` のデータをダンプしています
--
-- 場所: create_time >= '2020-11-01 00:00:00' 

LOCK TABLES `test_tb` WRITE;
/*!40000 ALTER TABLE `test_tb` でキーを無効にする */;
`test_tb` に値 (5,1005、'grdb'、'2020-11-01 00:00:00'、'2020-11-01 00:00:00') を挿入します。
`test_tb` に値 (6,1006、'sdfv'、'2020-11-01 02:00:00'、'2020-11-01 02:00:00') を挿入します。
`test_tb` に値 (7,1007,'fgfg','2020-11-06 02:00:00','2020-11-06 02:00:00') を挿入します。
`test_tb` に値 (8,1008、'tyth'、'2020-11-10 09:43:28'、'2020-11-10 09:43:28') を挿入します。
`test_tb` に値 (9,1009、'ewer'、'2020-11-10 09:43:28'、'2020-11-10 09:43:28') を挿入します。
`test_tb` に値 (10,1010,'erre','2020-11-11 15:17:03','2020-11-11 15:17:03') を挿入します。
# 6 つのデータは、データベース UNLOCK TABLES 内のクエリと一致しています。
-- ダンプは 2020-11-11 16:28:39 に完了しました

上記の結果から、--skip-tz-utc パラメータを使用した後、タイムスタンプ フィールドの値は変換されず、エクスポートされたデータも期待どおりであることがわかります。

3. ちょっとした提案

では、このパラメータの重要性は何でしょうか?データベース サーバーが異なるタイム ゾーンにある場合。 1 つのサーバーが北京 (東部第 8 地区) にあり、もう 1 つのサーバーが東京 (東部第 9 地区) にあるとします。この場合、北京のサーバーのデータを東京のサーバーにインポートする必要があります。デフォルトの --skip-tz-utc パラメータを使用せずにダンプ ファイルをインポートすると、照会されたタイムスタンプの時間データは、East Zone 8 サーバーの以前の時間値よりも 1 時間長くなります。ただし、East Zone 8 サーバーの 13:00 と East Zone 9 サーバーの 14:00 は同じ時間を表すため、East Zone 9 サーバーに表示される追加の 1 時間は正しいです。 --skip-tz-utc パラメータを追加すると、ダンプ ファイルが East 9 サーバーにインポートされた後、表示される時間値は East 8 サーバーによって以前に表示された時間値と同じですが、表す時間は異なります。

このパラメータの使用方法については、まず、--skip-tz-utc パラメータを追加するかどうかは、タイムスタンプ フィールドのインポートとエクスポートにのみ影響し、datetime フィールドには影響しないことを理解する必要があります。

ここで著者は、まずタイムスタンプ フィールドの使用を標準化することを推奨しています。たとえば、タイムスタンプ フィールドは作成時間と更新時間の要件にのみ使用され、データ行の作成時間と更新時間のみを表すため、ビジネスとの関連性は弱くなります。他の時間フィールドでは、datetime を使用するようにしてください。このように、mysqldump が異なるパラメータを使用しても、実際の影響は大きくありません。

サーバーが異なるタイムゾーンにある場合は、インポートおよびエクスポートされたデータが正確になるように、デフォルトに従うことをお勧めします。サーバーがすべて同じタイムゾーンにある場合、--skip-tz-utc パラメータを使用してもほとんど違いはありません。デフォルトでは、mysqldump はタイムスタンプ値を 0 タイムゾーンに変換して保存することを知っておく必要があります。部分的なデータをバックアップし、タイムスタンプ フィールドでフィルタリングする場合は、--skip-tz-utc パラメータを追加することをお勧めします。もう 1 つ注意点があります。完全バックアップから単一のデータベースまたは単一のテーブルのバックアップを選択する場合は、タイムスタンプ フィールドのデータにも注意する必要があります。

上記は、皆さんが知らないかもしれないmysqldumpパラメータの詳細です。mysqldumpパラメータの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL5.7 mysqldump バックアップとリカバリの実装
  • Linuxでmysqlの定期的なコールドバックアップを実装するためにmysqldump+expect+crontabを使用するアイデアの詳細な説明
  • mysqldump を使用した MySql のインポートおよびエクスポート方法の概要
  • MySQL mysqldump の使い方の詳しい説明
  • 完全バックアップとポイントインタイムバックアップにmysqldumpを使用する方法
  • Dockerはmysqldumpコマンドを使用してプロジェクト内のmysqlデータをバックアップおよびエクスポートします。
  • MySQLdump コマンドを使用した MySQL データの移行
  • PHP スケジュールバックアップ MySQL および mysqldump 構文パラメータの詳細
  • mysql バックアップ スクリプト mysqldump の使い方の詳細な説明
  • Linux mysqldump によるデータベース、データ、テーブル構造のエクスポートの詳細な説明
  • mysqldumpデータエクスポートの問題に関する詳細な議論
  • MySQL公式エクスポートツールmysqlpumpの使用

<<:  Portainer を使用して Docker のビジュアル インターフェースを構築する方法

>>:  SSM VUE Axios の詳細な説明

推薦する

マウスが画像のハイパーリンク上を通過するときに画像のサイズ(幅、高さ)を変更する CSS

マウスが画像の上を通過したときに画像のハイパーリンクを変更する方法:コードをコピーコードは次のとおり...

TypeScript の基本型の紹介

目次1. 基本タイプ2. オブジェクトタイプ2.1 配列2.2 タプル2.3 オブジェクト3. 型推...

JavaScript の for ループと二重 for ループの詳細な説明

forループfor ループは配列の要素をループします。文法: for (初期化変数; 条件式; 繰り...

nginx のロードバランシングとリバースプロキシの説明

目次負荷分散負荷分散分類1. DNS 負荷分散2. IP負荷分散3. リンク層の負荷分散4. ハイブ...

HTML のオートコンプリートを無効にして履歴を表示しないようにする

入力ボックスには、コンテンツを入力するときに常に入力履歴が表示されます。これを無効にする現在の方法は...

フロントエンド例外 502 不正なゲートウェイの原因と解決策

目次502 不正なゲートウェイ エラーの発生1. 502 不正なゲートウェイ エラーとは何ですか? ...

Nginx 外部ネットワーク アクセス イントラネット サイト構成操作

背景:サイトはフロントエンドとバックエンドから分離されています: vue+springbootフロン...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

Dockerを使用してphabricatorをインストールする方法

ここでは Ubuntu 16.04 システムを使用しています。 dockerを使用したインストールh...

JS は Web ページナビゲーションバーの特殊効果を実現します

この記事では、ネイティブ JS を使用して実装された実用的な Web ナビゲーション バー効果を紹介...

Linuxコマンド履歴の調整方法の詳細な説明

Linux システムの bash history コマンドは、以前に実行したコマンドを記憶し、再入力...

Vue 手書き読み込みアニメーション プロジェクト

ページが応答しない場合、白い画面が表示されないように、読み込みアニメーションを表示するのがユーザーフ...

nginxリバースプロキシによるセッション障害の問題の解決策

同僚から助けを求められました。バックエンド システムへのログインは成功したものの、システムには正常に...

MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]

mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...