sql >> データベース >  >> RDS >> Mysql

MySQLシェルを使用した論理データベースのバックアップ

    MySQLdumpは、元々IgorRomanenkoによって作成されたMySQLの一般的な論理バックアップツールです。

    Mysqldumpは、論理バックアップ(SQLステートメントのセット)を実行します。デフォルトでは、mysqldumpはinformation_schemaテーブルをダンプせず、performance_schemaを取得しません。ただし、mysqldumpの主な欠点は、バックアップと復元の実行中に1つのスレッドしか使用しないことです。 (サーバーにも64コアがあります)。この欠点を克服するために、MySQLはシェルクライアントに新しいユーティリティを導入しました。このブログでは、これらの新しいバックアップユーティリティについて説明します。

    MySQLシェルの概要

    MySQLシェルは、MySQLサーバー用の強力で高度なクライアントおよびコードエディターです。 MySQLシェル8.0.21には、論理ダンプを作成し、ユーザーを含むデータベースインスタンス全体に対して論理リストアを実行するためのいくつかのエキサイティングな新しいユーティリティが含まれています。

    MySQLシェル8.0.22には、特定のテーブルの論理バックアップと復元が含まれていました。

    ユーティリティ
    • util.dumpInstance()-ユーザーを含むデータベースインスタンス全体をダンプします
    • util.dumpSchemas()-一連のスキーマをダンプします
    • util.loadDump()-ダンプをターゲットデータベースにロードします
    • util.dumpTables()-特定のテーブルとビューをロードします。

    util.dumpInstance()

    dumpInstance()ユーティリティは、MySQLデータディレクトリにあるすべてのデータベースをダンプします。ダンプの取得中に、information_schema、mysql、ndbinfo、performance_schema、およびsysスキーマが除外されます。

    構文
    util.dumpInstance(outputUrl[, options]) 

    ローカルファイルシステムにダンプします。outputUrlは、ダンプファイルが配置されるローカルディレクトリへのパスを指定する文字列です。絶対パスまたは現在の作業ディレクトリからの相対パスを指定できます。

    このユーティリティには、スキーマを検査して互換性の問題を表示し、問題を削除するために適切な互換性オプションを適用してダンプを実行するドライランオプションがあります。

    オプション このdumputilityのいくつかの重要なオプションを見てみましょう。

    ocimds:[True |誤り]

    このオプションがtrueに設定されている場合、データディクショナリ、インデックスディクショナリ、およびCREATE TABLEステートメントの暗号化オプションがDDLファイルでコメント化されていることを確認し、すべてのテーブルがMySQLデータディレクトリとデフォルトのスキーマ暗号化を使用します。

    また、InnoDB以外のCREATE TABLEステートメント内のストレージエンジン、ユーザーまたはロールへの不適切な特権の付与、およびその他の互換性の問題をチェックします。

    不適合なSQLステートメントが見つかった場合、例外が発生し、ダンプが停止されます。

    したがって、ダンププロセスを開始する前に、dryRunオプションを使用して、ダンプ内のアイテムに関するすべての問題を一覧表示することをお勧めします。互換性オプションを使用して、ダンプ出力の問題を自動的に修正します。

    注:このオプションは、インスタンスダンプユーティリティとスキーマダンプユーティリティのみをサポートします。

    例1
    MySQL  localhost:3306 ssl  cart  JS > util.dumpInstance("/home/vagrant/production_backup", {ocimds: true,compatibility: ["strip_restricted_grants"]})
    
    Acquiring global read lock
    
    Global read lock acquired
    
    All transactions have been started
    
    Locking instance for backup
    
    NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
    
    Global read lock has been released
    
    Checking for compatibility with MySQL Database Service 8.0.22
    
    NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
    
    NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
    
    ERROR: Table 'cart'.'sales' uses unsupported storage engine MyISAM (fix this with 'force_innodb' compatibility option)
    
    Compatibility issues with MySQL Database Service 8.0.22 were found. Please use the 'compatibility' option to apply compatibility adaptations to the dumped DDL.
    
    Util.dumpInstance: Compatibility issues were found (RuntimeError)

    したがって、カートデータベースにmyisamテーブルがあります。ドライランオプションは明らかにエラーをスローします。

    ダンプファイルでこれらのエラーを自動的に修正する場合は、コマンドの引数として互換性オプションを渡します。

    例2
    MySQL  localhost:3306 ssl  cart  JS > util.dumpInstance("/home/vagrant/production_backup", {dryRun: true ,ocimds: true,compatibility: ["strip_restricted_grants","force_innodb"]})
    
    Acquiring global read lock
    
    Global read lock acquired
    
    All transactions have been started
    
    Locking instance for backup
    
    NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
    
    Global read lock has been released
    
    Checking for compatibility with MySQL Database Service 8.0.22
    
    NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
    
    NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
    
    NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
    
    NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
    
    Compatibility issues with MySQL Database Service 8.0.22 were found and repaired. Please review the changes made before loading them.
    
    Writing global DDL files
    
    Writing users DDL
    
    Writing DDL for schema `cart`
    
    Writing DDL for table `cart`.`salaries`
    
    Writing DDL for table `cart`.`sales`
    
    Writing DDL for table `cart`.`t1`
    
    Preparing data dump for table `cart`.`salaries`
    
    Data dump for table `cart`.`salaries` will be chunked using column `id`
    
    Preparing data dump for table `cart`.`sales`
    
    Data dump for table `cart`.`sales` will be chunked using column `id`
    
    Preparing data dump for table `cart`.`t1`
    
    NOTE: Could not select a column to be used as an index for table `cart`.`t1`. Chunking has been disabled for this table, data will be dumped to a single file.

    これでドライランは問題なく、例外はありません。 dumpinstanceコマンドを実行してインスタンスのバックアップを取りましょう。

    エクスポートを実行する前に、ターゲットディレクトリが空である必要があります。ディレクトリがその親ディレクトリにまだ存在しない場合、ユーティリティはそれを作成します。

    例3
    MySQL  localhost:3306 ssl  cart  JS > util.dumpInstance("/home/vagrant/production_backup", {compatibility: ["strip_restricted_grants","force_innodb"],threads : 12})
    
    Acquiring global read lock
    
    Global read lock acquired
    
    All transactions have been started
    
    Locking instance for backup
    
    Global read lock has been released
    
    Writing global DDL files
    
    Writing users DDL
    
    Writing DDL for schema `cart`
    
    Writing DDL for view `cart`.`price`
    
    Writing DDL for table `cart`.`dummy`
    
    Writing DDL for table `cart`.`salaries`
    
    Writing DDL for schema `sbtest`
    
    Writing DDL for table `sbtest`.`sbtest1`
    
    Writing DDL for table `sbtest`.`sbtest10`
    
    .
    
    .
    
    .
    
    1 thds dumping - 99% (624.55K rows / ~625.40K rows), 896.15K rows/s, 10.13 MB/s uncompressed, 3.73 MB/s compressed 
    
    Duration: 00:00:00s                                                                                               
    
    Schemas dumped: 2                                                                                                 
    
    Tables dumped: 18                                                                                                 
    
    Uncompressed data size: 7.14 MB                                                                                   
    
    Compressed data size: 2.79 MB                                                                                     
    
    Compression ratio: 2.6                                                                                            
    
    Rows written: 624550                                                                                              
    
    Bytes written: 2.79 MB                                                                                            
    
    Average uncompressed throughput: 7.14 MB/s                                                                        
    
    Average compressed throughput: 2.79 MB/s

    上記では、互換性オプションを使用しました。したがって、ダンプを取得している間、myisamテーブルをinnodbに変換し、ファイルに保存します。

    ログ
    [[email protected] production_backup]$ cat [email protected]
    
    -- MySQLShell dump 1.0.1  Distrib Ver 8.0.22 for Linux on x86_64 - for MySQL 8.0.22 (MySQL Community Server (GPL)), for Linux (x86_64)
    
    --
    
    -- Host: localhost    Database: cart    Table: sales
    
    -- ------------------------------------------------------
    
    -- Server version 5.7.32
    
    --
    
    -- Table structure for table `sales`
    
    --
    
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    
    /*!50503 SET character_set_client = utf8mb4 */;
    
    CREATE TABLE IF NOT EXISTS `sales` (
    
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    
      `name` varchar(30) DEFAULT NULL,
    
      `address` varchar(30) DEFAULT NULL,
    
      PRIMARY KEY (`id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    /*!40101 SET character_set_client = @saved_cs_client */;

    mysqldumpを使用している場合は、出力が1つのファイルに保存されます。ただし、以下で説明するように、ここではより多くのファイルが生成されます。

    これらは、バックアップディレクトリで使用可能なファイルです。

    [[email protected] production_backup]$ ls -lrth
    
    total 52K
    
    -rw-r-----. 1 vagrant vagrant  707 Nov  6 02:36 @.json
    
    -rw-r-----. 1 vagrant vagrant  287 Nov  6 02:36 cart.json
    
    -rw-r-----. 1 vagrant vagrant  240 Nov  6 02:36 @.sql
    
    -rw-r-----. 1 vagrant vagrant  240 Nov  6 02:36 @.post.sql
    
    -rw-r-----. 1 vagrant vagrant 2.6K Nov  6 02:36 @.users.sql
    
    -rw-r-----. 1 vagrant vagrant  733 Nov  6 02:36 [email protected]
    
    -rw-r-----. 1 vagrant vagrant  486 Nov  6 02:36 cart.sql
    
    -rw-r-----. 1 vagrant vagrant  575 Nov  6 02:36 [email protected]
    
    -rw-r-----. 1 vagrant vagrant    8 Nov  6 02:36 [email protected]@0.tsv.zst.idx
    
    -rw-r-----. 1 vagrant vagrant    8 Nov  6 02:36 [email protected]@@1.tsv.zst.idx
    
    -rw-r-----. 1 vagrant vagrant   47 Nov  6 02:36 [email protected]@0.tsv.zst
    
    -rw-r-----. 1 vagrant vagrant   24 Nov  6 02:36 [email protected]@@1.tsv.zst
    
    -rw-r-----. 1 vagrant vagrant  252 Nov  6 02:36 @.done.json
    • この@.jsonファイルには、サーバーの詳細とユーザーのリスト、データベース名、およびそれらの文字セットが含まれています。
    • このcart.jsonファイルには、ビュー、SP、関数名、およびテーブルのリストが含まれています。
    • この@.sqlファイルと@.post.sqlファイルには、MySQLサーバーのバージョンの詳細が含まれています。
    • この@.users.sqlファイルには、データベースユーザーのリストが含まれています。
    • この[email protected]ファイルにはテーブル構造が含まれています。
    • このcart.sqlファイルにはデータベースステートメントが含まれています。
    • この[email protected]ファイルには、列名と文字セットが含まれています。
    • example @ [email protected]ファイルはバイナリファイルです。テーブルインデックスの統計を保存します。
    • example @ sqldat.com @ 0.tsv.zstファイルはバイナリファイルであり、データを保存します。
    • この@.done.jsonファイルには、バックアップの終了時刻とデータファイルのサイズがKB単位で含まれています。

    util.dumpSchemas()

    このユーティリティの引数で言及した特定のスキーマをダンプします。

    構文
    ​util.dumpSchemas(schemas, outputUrl[, options])
    MySQL  localhost:3306 ssl  cart  JS > util.dumpSchemas(["cart"], "/home/vagrant/production_backup",{compatibility: ["strip_restricted_grants","force_innodb"],threads :12})
    
    Acquiring global read lock
    
    Global read lock acquired
    
    All transactions have been started
    
    Locking instance for backup
    
    NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
    
    Global read lock has been released
    
    Writing global DDL files
    
    Writing DDL for table `cart`.`price_tag`
    
    Writing DDL for schema `cart`
    
    Writing DDL for table `cart`.`salaries`
    
    Writing DDL for table `cart`.`sales`
    
    NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
    
    Preparing data dump for table `cart`.`price_tag`
    
    Data dump for table `cart`.`price_tag` will be chunked using column `id`
    
    Data dump for table `cart`.`price_tag` will be written to 1 file
    
    Preparing data dump for table `cart`.`salaries`
    
    Data dump for table `cart`.`salaries` will be chunked using column `id`
    
    Data dump for table `cart`.`salaries` will be written to 2 files
    
    Preparing data dump for table `cart`.`sales`
    
    Data dump for table `cart`.`sales` will be chunked using column `id`
    
    Running data dump using 12 threads.
    
    NOTE: Progress information uses estimated values and may not be accurate.
    
    Data dump for table `cart`.`sales` will be written to 1 file                                               
    
    1 thds dumping - 150% (3 rows / ~2 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed          
    
    Duration: 00:00:00s                                                                              
    
    Schemas dumped: 1                                                                                
    
    Tables dumped: 3                                                                                 
    
    Uncompressed data size: 53 bytes                                                                 
    
    Compressed data size: 0 bytes                                                                    
    
    Compression ratio: 53.0                                                                          
    
    Rows written: 3                                                                                  
    
    Bytes written: 0 bytes                                                                           
    
    Average uncompressed throughput: 53.00 B/s                                                       
    
    Average compressed throughput: 0.00 B/s                

    util.dumpTables

    特定のテーブルをダンプする場合は、dumpTablesユーティリティを使用できます。

    テーブルが大きい場合、mysqldumpの時間が長くなります。 dumpTablesユーティリティを使用して時間を短縮します。

    構文
    util.dumpTables(schema, tables, outputUrl[, options])
    util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{dryRun: true})
    
    ​ MySQL  localhost:33060+ ssl  sbtest  JS > util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{threads: 12})
    
    Acquiring global read lock
    
    Global read lock acquired
    
    All transactions have been started
    
    Locking instance for backup
    
    Global read lock has been released
    
    Writing global DDL files
    
    Writing DDL for table `sbtest`.`sbtest16`
    
    Writing DDL for table `sbtest`.`sbtest14`
    
    Preparing data dump for table `sbtest`.`sbtest16`
    
    Data dump for table `sbtest`.`sbtest16` will be chunked using column `id`
    
    Preparing data dump for table `sbtest`.`sbtest14`
    
    Data dump for table `sbtest`.`sbtest14` will be chunked using column `id`
    
    Running data dump using 12 threads.
    
    NOTE: Progress information uses estimated values and may not be accurate.
    
    Data dump for table `sbtest`.`sbtest16` will be written to 1 file
    
    Data dump for table `sbtest`.`sbtest14` will be written to 1 file
    
    1 thds dumping - 99% (78.07K rows / ~78.08K rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
    
    Duration: 00:00:00s                                                                                       
    
    Schemas dumped: 1                                                                                         
    
    Tables dumped: 2                                                                                          
    
    Uncompressed data size: 892.39 KB                                                                         
    
    Compressed data size: 348.91 KB                                                                           
    
    Compression ratio: 2.6                                                                                    
    
    Rows written: 78068                                                                                       
    
    Bytes written: 348.91 KB                                                                                  
    
    Average uncompressed throughput: 892.39 KB/s                                                              
    
    Average compressed throughput: 348.91 KB/s 
    ダンプ読み込みユーティリティ

    ダンプロードユーティリティは、リモートストレージへのデータストリーミング、テーブルまたはテーブルチャンクの並列ロード、進行状況の追跡、再開およびリセット機能、およびダンプがまだ行われている間の同時ロードのオプションを提供します。

    注:ダンプロードユーティリティはLOAD DATA LOCAL INFILEステートメントを使用するため、インポート中にこのlocal_infileパラメータをグローバルに有効にする必要があります。

    ダンプロードユーティリティは、sql_require_primary_keyシステム変数がONに設定されているかどうかを確認し、ONに設定されている場合は、ダンプファイルに主キーのないテーブルがあるとエラーを返します。

    構文
    util.loadDump(url[, options])
    MySQL  localhost:3306 ssl  sbtest  JS > util.loadDump("/home/vagrant/specific_table", {progressFile :"/home/vagrant/specific_table/log.json",threads :12})
    
    Loading DDL and Data from '/home/vagrant/specific_table' using 12 threads.
    
    Opening dump...
    
    Target is MySQL 8.0.22. Dump was produced from MySQL 8.0.22
    
    Checking for pre-existing objects...
    
    Executing common preamble SQL
    
    [Worker006] Executing DDL script for `sbtest`.`sbtest1`
    
    [Worker004] Executing DDL script for `sbtest`.`sbtest12`
    
    2 thds loading \ 100% (892.39 KB / 892.39 KB), 0.00 B/s, 0 / 2 tables done[Worker001] [email protected]@@0.tsv.zst: Records: 39034  Deleted: 0  Skipped: 0  Warnings: 0
    
    [Worker005] [email protected]@@0.tsv.zst: Records: 39034  Deleted: 0  Skipped: 0  Warnings: 0
    
    Executing common postamble SQL                                                                                                   
    
    2 chunks (78.07K rows, 892.39 KB) for 2 tables in 1 schemas were loaded in 1 sec (avg throughput 892.39 KB/s)
    
    0 warnings were reported during the load.

    デフォルトでは、テーブルのフルテキストインデックスは、テーブルが完全にロードされた後にのみ作成されるため、インポートが高速化されます。

    インポート中にインデックスの作成を無効にし、後でインデックスを作成することもできます。

    ダンプロードユーティリティは、並列処理を最大化するために複数のスレッドにインポートします。ダンプファイルがMySQLShellのダンプユーティリティによって圧縮されている場合、ダンプロードユーティリティは解凍を処理します。

    インポートする、またはインポートから除外する個々のテーブルまたはスキーマを選択できます。

    SET sql_log_bin =0ステートメントを使用して、インポート中にターゲットMySQLインスタンスのバイナリロギングをスキップすることを選択できます。

    結論

    これは、MySQL8.0の強力なユーティリティの1つです。 MySQL 5.6からダンプし、これらのダンプをMySQL5.7または8.0にロードできるようになりました。ただし、MySQL 5.6からダンプする場合、ユーザーアカウントのダンプはサポートされていません。次のブログでは、MySQLdumpとシェルユーティリティのバックアップ/復元速度を比較します。


    1. MySQL/MariaDBでデータベースを削除する方法

    2. Androidデバイスのデータ/データフォルダにアクセスするにはどうすればよいですか?

    3. PostgreSQLでのトランザクション分離

    4. PythonはMySQLのプリペアドステートメントをサポートしていますか?