- ドキュメント ホーム
- TiDBについて
- クイックスタート
- 発展させる
- 概要
- クイックスタート
- TiDB Cloud(開発者層) で TiDB クラスターを構築する
- TiDB の CRUD SQL
- TiDB でシンプルな CRUD アプリを構築する
- 応用例
- TiDB に接続する
- データベース スキーマの設計
- 書き込みデータ
- データの読み取り
- 取引
- 最適化
- トラブルシューティング
- 参照
- 書店のサンプル アプリケーション
- ガイドライン
- アーカイブされたドキュメント
- クラウドネイティブ開発環境
- サードパーティのサポート
- デプロイ
- 移行する
- 管理
- 監視と警告
- トラブルシューティング
- TiDB トラブルシューティング マップ
- 遅いクエリを特定する
- 遅いクエリを分析する
- SQL 診断
- Top SQLを使用して高価なクエリを特定する
- ログを使用して高価なクエリを特定する
- ステートメント要約表
- ホットスポットの問題のトラブルシューティング
- 増加した読み取りおよび書き込み遅延のトラブルシューティング
- クラスターのオンサイト情報の保存と復元
- クラスタ セットアップのトラブルシューティング
- 高いディスク I/O 使用率のトラブルシューティング
- ロック競合のトラブルシューティング
- TiFlash のトラブルシューティング
- オプティミスティック トランザクションでの書き込み競合のトラブルシューティング
- データとインデックス間の不一致のトラブルシューティング
- 性能チューニング
- チューニングガイド
- Configuration / コンフィグレーションのチューニング
- システムのチューニング
- ソフトウェアのチューニング
- Configuration / コンフィグレーション
- コプロセッサ キャッシュ
- SQL チューニング
- チュートリアル
- TiDB ツール
- 概要
- ユースケース
- ダウンロード
- TiUP
- ドキュメンテーション マップ
- 概要
- 用語と概念
- TiUP コンポーネントの管理
- FAQ
- トラブルシューティングガイド
- コマンドリファレンス
- 概要
- TiUP コマンド
- TiUP クラスタ コマンド
- 概要
- tiup cluster audit
- tiup cluster check
- tiup cluster clean
- tiup cluster deploy
- tiup cluster destroy
- tiup cluster disable
- tiup cluster display
- tiup cluster edit-config
- tiup cluster enable
- tiup cluster help
- tiup cluster import
- tiup cluster list
- tiup cluster patch
- tiup cluster prune
- tiup cluster reload
- tiup cluster rename
- tiup cluster replay
- tiup cluster restart
- tiup cluster scale-in
- tiup cluster scale-out
- tiup cluster start
- tiup cluster stop
- tiup cluster template
- tiup cluster upgrade
- TiUP DMコマンド
- TiDB クラスター トポロジ リファレンス
- DM クラスタ トポロジ リファレンス
- ミラー リファレンス ガイド
- TiUP コンポーネント
- PingCAPクリニック診断サービス
- TiDB Operator
- Dumpling
- TiDB Lightning
- TiDB データ移行
- バックアップと復元 (BR)
- Binlog
- TiCDC
- Dumpling
- 同期差分インスペクター
- ティスパーク
- 参照
- クラスタ アーキテクチャ
- 主な監視指標
- セキュリティ
- 権限
- SQL
- SQL 言語の構造と構文
- SQL ステートメント
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ADMIN SHOW TELEMETRY
ALTER DATABASE
ALTER INDEX
ALTER INSTANCE
ALTER PLACEMENT POLICY
ALTER TABLE
ALTER TABLE COMPACT
ALTER USER
ANALYZE TABLE
BACKUP
BATCH
BEGIN
CHANGE COLUMN
COMMIT
CHANGE DRAINER
CHANGE PUMP
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE PLACEMENT POLICY
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP PLACEMENT POLICY
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW ANALYZE STATUS
SHOW [BACKUPS|RESTORES]
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE PLACEMENT POLICY
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLACEMENT
SHOW PLACEMENT FOR
SHOW PLACEMENT LABELS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TABLE
TRACE
TRUNCATE
UPDATE
USE
WITH
- データ型
- 関数と演算子
- クラスタ化インデックス
- 制約
- 生成された列
- SQL モード
- テーブル属性
- 取引
- ガベージ コレクション (GC)
- ビュー
- パーティショニング
- 一時テーブル
- キャッシュされたテーブル
- 文字セットと照合順序
- SQL の配置規則
- システム テーブル
mysql
- 情報_スキーマ
- 概要
ANALYZE_STATUS
CLIENT_ERRORS_SUMMARY_BY_HOST
CLIENT_ERRORS_SUMMARY_BY_USER
CLIENT_ERRORS_SUMMARY_GLOBAL
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DATA_LOCK_WAITS
DDL_JOBS
DEADLOCKS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PLACEMENT_POLICIES
PROCESSLIST
REFERENTIAL_CONSTRAINTS
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_HOT_REGIONS_HISTORY
TIDB_INDEXES
TIDB_SERVERS_INFO
TIDB_TRX
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- TiDB ダッシュボード
- 概要
- 管理
- アクセス
- 概要ページ
- クラスター情報ページ
- Top SQLページ
- キー ビジュアライザー ページ
- メトリクス関係グラフ
- SQL ステートメントの分析
- スロークエリページ
- クラスタ診断
- 検索ログ ページ
- インスタンスのプロファイリング
- セッションの管理とConfiguration / コンフィグレーション
- FAQ
- CLI
- コマンド ライン フラグ
- Configuration / コンフィグレーションファイルのパラメーター
- システム変数
- ストレージ エンジン
- テレメトリー
- エラーコード
- テーブル フィルター
- トポロジ ラベルごとにレプリカをスケジュールする
- よくある質問
- リリースノート
- すべてのリリース
- リリースのタイムライン
- TiDB のバージョニング
- v6.1
- v6.0
- v5.4
- v5.3
- v5.2
- v5.1
- v5.0
- v4.0
- v3.1
- v3.0
- v2.1
- v2.0
- v1.0
- 用語集
DMでシャーディングDDLロックを手動で処理する
DMは、シャーディングDDLロックを使用して、操作が正しい順序で実行されるようにします。このロックメカニズムは、ほとんどの場合、シャーディングDDLロックを自動的に解決しますが、一部の異常なシナリオでは、 shard-ddl-lock
コマンドを使用して異常なDDLロックを手動で処理する必要があります。
ノート:
- このドキュメントは、ペシミスティックコーディネーションモードでのシャーディングDDLロックの処理にのみ適用されます。
- このドキュメントの「コマンドの使用法」セクションのコマンドは、対話モードです。コマンドラインモードでは、エラーレポートを回避するためにエスケープ文字を追加する必要があります。
- コマンドによってもたらされる可能性のある影響を完全に認識していて、それらを受け入れることができる場合を除いて、
shard-ddl-lock unlock
を使用しないでください。- 異常なDDLロックを手動で処理する前に、 シャードマージの原則をすでに読んでいることを確認してください。
指示
shard-ddl-lock
このコマンドを使用して、DDLロックを表示し、DMマスターに指定されたDDLロックを解放するように要求できます。このコマンドは、DMv6.0以降でのみサポートされています。以前のバージョンでは、 show-ddl-locks
およびunlock-ddl-locks
コマンドを使用する必要があります。
shard-ddl-lock -h
maintain or show shard-ddl locks information
Usage:
dmctl shard-ddl-lock [task] [flags]
dmctl shard-ddl-lock [command]
Available Commands:
unlock Unlock un-resolved DDL locks forcely
Flags:
-h, --help help for shard-ddl-lock
Global Flags:
-s, --source strings MySQL Source ID.
Use "dmctl shard-ddl-lock [command] --help" for more information about a command.
引数の説明
shard-ddl-lock [task] [flags]
:現在のDMマスターのDDLロック情報を表示します。
shard-ddl-lock [command]
:指定されたDDLロックを解放するようにDMマスターに要求します。[command]
は値としてunlock
のみを受け入れます。
使用例
shard-ddl-lock [task][flags]
shard-ddl-lock [task] [flags]
を使用して、現在のDMマスターのDDLロック情報を表示できます。例えば:
shard-ddl-lock test
期待される出力
{
"result": true, # The result of the query for the lock information.
"msg": "", # The additional message for the failure to query the lock information or other descriptive information (for example, the lock task does not exist).
"locks": [ # The existing lock information list.
{
"ID": "test-`shard_db`.`shard_table`", # The lock ID, which is made up of the current task name and the schema/table information corresponding to the DDL.
"task": "test", # The name of the task to which the lock belongs.
"mode": "pessimistic" # The shard DDL mode. Can be set to "pessimistic" or "optimistic".
"owner": "mysql-replica-01", # The owner of the lock (the ID of the first source that encounters this DDL operation in the pessimistic mode), which is always empty in the optimistic mode.
"DDLs": [ # The list of DDL operations corresponding to the lock in the pessimistic mode, which is always empty in the optimistic mode.
"USE `shard_db`; ALTER TABLE `shard_db`.`shard_table` DROP COLUMN `c2`;"
],
"synced": [ # The list of sources that have received all sharding DDL events in the corresponding MySQL instance.
"mysql-replica-01"
],
"unsynced": [ # The list of sources that have not yet received all sharding DDL events in the corresponding MySQL instance.
"mysql-replica-02"
]
}
]
}
shard-ddl-lock unlock
このコマンドは、所有者にDDLステートメントの実行を要求する、所有者ではない他のすべてのDMワーカーにDDLステートメントをスキップするように要求する、 DM-master
のロック情報を削除するなど、指定されたDDLロックのロックを解除するようにDM-master
をアクティブに要求します。
ノート:
現在、
shard-ddl-lock unlock
はpessimistic
モードのロックに対してのみ有効です。
shard-ddl-lock unlock -h
Unlock un-resolved DDL locks forcely
Usage:
dmctl shard-ddl-lock unlock <lock-id> [flags]
Flags:
-a, --action string accept skip/exec values which means whether to skip or execute ddls (default "skip")
-d, --database string database name of the table
-f, --force-remove force to remove DDL lock
-h, --help help for unlock
-o, --owner string source to replace the default owner
-t, --table string table name
Global Flags:
-s, --source strings MySQL Source ID.
shard-ddl-lock unlock
は、次の引数を受け入れます。
-o, --owner
:- 国旗;ストリング;オプション
- 指定されていない場合、このコマンドはデフォルトの所有者(
shard-ddl-lock
の結果の所有者)にDDLステートメントの実行を要求します。指定されている場合、このコマンドはMySQLソース(デフォルトの所有者の代替)にDDLステートメントの実行を要求します。 - 元の所有者がクラスタから既に削除されていない限り、新しい所有者を指定しないでください。
-f, --force-remove
:- 国旗;ブール値;オプション
- 指定されていない場合、このコマンドは、所有者がDDLステートメントの実行に成功した場合にのみロック情報を削除します。指定されている場合、所有者がDDLステートメントの実行に失敗した場合でも、このコマンドはロック情報を強制的に削除します(これを実行した後は、ロックを再度照会または操作することはできません)。
lock-id
:- 非フラグ;ストリング;必要
- ロックを解除する必要があるDDLロックのIDを指定します(
shard-ddl-lock
の結果のID
)。
以下は、 shard-ddl-lock unlock
コマンドの例です。
shard-ddl-lock unlock test-`shard_db`.`shard_table`
{
"result": true, # The result of the unlocking operation.
"msg": "", # The additional message for the failure to unlock the lock.
}
サポートされているシナリオ
現在、 shard-ddl-lock unlock
コマンドは、次の2つの異常なシナリオでのシャーディングDDLロックの処理のみをサポートしています。
シナリオ1:一部のMySQLソースが削除されます
異常なロックの理由
DM-master
がシャーディングDDLロックのロックを自動的に解除しようとする前に、すべてのMySQLソースがシャーディングDDLイベントを受信する必要があります(詳細については、 シャードマージの原則を参照してください)。シャーディングDDLイベントがすでに移行プロセスにあり、一部のMySQLソースが削除されて再ロードされない場合(これらのMySQLソースはアプリケーションの要求に応じて削除されます)、シャーディングDDLロックを自動的に移行およびロック解除することはできません。すべてのDMワーカーがDDLイベントを受信できるわけではないためです。
ノート:
シャーディングDDLイベントを移行していないときに、一部のDMワーカーをオフラインにする必要がある場合は、
stop-task
を使用して実行中のタスクを最初に停止し、DMワーカーをオフラインにして、対応する構成情報をから削除することをお勧めします。タスク構成ファイルを作成し、最後にstart-task
と新しいタスク構成を使用して移行タスクを再開します。
手動ソリューション
アップストリームに2つのインスタンスMySQL-1
( mysql-replica-01
)とMySQL-2
( mysql-replica-02
)があり、2つのテーブルshard_db_1
があるとします。 shard_table_1
とshard_db_1
。 MySQL-1
のshard_table_2
と2つのテーブルshard_db_2
。 shard_table_1
とshard_db_2
。 MySQL-2
のshard_table_2
。次に、4つのテーブルをマージし、それらをテーブルshard_db
に移行する必要があります。ダウンストリームTiDBでshard_table
。
初期のテーブル構造は次のとおりです。
SHOW CREATE TABLE shard_db_1.shard_table_1;
+---------------+------------------------------------------+
| Table | Create Table |
+---------------+------------------------------------------+
| shard_table_1 | CREATE TABLE `shard_table_1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+------------------------------------------+
次のDDL操作は、テーブル構造を変更するためにアップストリームのシャードテーブルで実行されます。
ALTER TABLE shard_db_*.shard_table_* ADD COLUMN c2 INT;
MySQLとDMの操作プロセスは次のとおりです。
対応するDDL操作は、テーブル構造を変更するために
mysql-replica-01
の2つのシャードテーブルで実行されます。ALTER TABLE shard_db_1.shard_table_1 ADD COLUMN c2 INT;
ALTER TABLE shard_db_1.shard_table_2 ADD COLUMN c2 INT;
DM-workerは、
mysql-replica-01
の2つのシャーディングテーブルの受信したDDL情報をDM-masterに送信し、DM-masterは対応するDDLロックを作成します。shard-ddl-lock
を使用して、現在のDDLロックの情報を確認します。» shard-ddl-lock test { "result": true, "msg": "", "locks": [ { "ID": "test-`shard_db`.`shard_table`", "task": "test", "mode": "pessimistic" "owner": "mysql-replica-01", "DDLs": [ "USE `shard_db`; ALTER TABLE `shard_db`.`shard_table` ADD COLUMN `c2` int(11);" ], "synced": [ "mysql-replica-01" ], "unsynced": [ "mysql-replica-02" ] } ] }
アプリケーションの需要により、
mysql-replica-02
に対応するデータをダウンストリームTiDBに移行する必要がなくなり、mysql-replica-02
が削除されます。IDが
test-`shard_db`.`shard_table`
対DM-master
のロックは、mysql-replica-02
のDDL情報を受信できません。- 返される結果
unsynced
には、常にshard-ddl-lock
の情報が含まれていmysql-replica-02
。
- 返される結果
shard-ddl-lock unlock
を使用してDM-master
を要求し、DDLロックをアクティブにロック解除します。DDLロックの所有者がオフラインになった場合は、パラメーター
--owner
を使用して、DDLを実行するための新しい所有者として別のDMワーカーを指定できます。いずれかのMySQLソースがエラーを報告した場合、
result
はfalse
に設定されます。この時点で、各MySQLソースのエラーが許容可能であり、期待範囲内であるかどうかを注意深く確認する必要があります。shard-ddl-lock unlock test-`shard_db`.`shard_table`
{ "result": true, "msg": ""
shard-ddl-lock
を使用して、DDLロックが正常にロック解除されているかどうかを確認します。» shard-ddl-lock test { "result": true, "msg": "no DDL lock exists", "locks": [ ] }
ダウンストリームTiDBでテーブル構造が正常に変更されているかどうかを確認します。
mysql> SHOW CREATE TABLE shard_db.shard_table; +-------------+--------------------------------------------------+ | Table | Create Table | +-------------+--------------------------------------------------+ | shard_table | CREATE TABLE `shard_table` ( `c1` int(11) NOT NULL, `c2` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin | +-------------+--------------------------------------------------+
query-status
を使用して、移行タスクが正常かどうかを確認します。
影響
shard-ddl-lock unlock
を使用して手動でロックのロックを解除した後、タスク構成情報に含まれるオフラインのMySQLソースを処理しないと、次のシャーディングDDLイベントを受信したときにロックを自動的に移行できない場合があります。
したがって、DDLロックを手動でロック解除した後、次の操作を実行する必要があります。
stop-task
を使用して、実行中のタスクを停止します。- タスク構成ファイルを更新し、オフラインのMySQLソースの関連情報を構成ファイルから削除します。
start-task
と新しいタスク構成ファイルを使用して、タスクを再開します。
ノート:
shard-ddl-lock unlock
を実行した後、オフラインになったMySQLソースが再ロードされ、DMワーカーがシャーディングされたテーブルのデータを移行しようとすると、データとダウンストリームテーブル構造の間で一致エラーが発生する可能性があります。
シナリオ2:一部のDMワーカーが異常に停止するか、DDLロック解除プロセス中にネットワーク障害が発生します
異常なロックの理由
DM-master
がすべてのDMワーカーのDDLイベントを受信した後、自動的に実行されるunlock DDL lock
には、主に次の手順が含まれます。
- ロックの所有者に、DDLを実行し、対応するシャードテーブルのチェックポイントを更新するように依頼します。
- 所有者がDDLを正常に実行した後、
DM-master
に格納されているDDLロック情報を削除します。 - 所有者がDDLを正常に実行した後、他のすべての非所有者にDDLをスキップし、対応するシャードテーブルのチェックポイントを更新するように依頼します。
- DMマスターは、すべての所有者または非所有者の操作が成功した後、対応するDDLロック情報を削除します。
現在、上記のロック解除プロセスはアトミックではありません。非所有者がDDL操作を正常にスキップすると、非所有者がいるDMワーカーが異常に停止するか、ダウンストリームTiDBでネットワーク異常が発生し、チェックポイントの更新が失敗する可能性があります。
非所有者に対応するMySQLソースがデータ移行を復元すると、非所有者は、例外が発生する前に調整されたDDL操作を再調整するようにDMマスターに要求しようとし、他から対応するDDL操作を受信することはありません。 MySQLソース。これにより、DDL操作で対応するロックが自動的にロック解除される可能性があります。
手動ソリューション
これで、 一部のMySQLソースが削除されましたの手動ソリューションと同じアップストリームとダウンストリームのテーブル構造があり、テーブルのマージと移行に対する需要が同じであると仮定します。
DM-master
が自動的にロック解除プロセスを実行すると、所有者( mysql-replica-01
)はDDLを正常に実行し、移行プロセスを続行します。ただし、非所有者( mysql-replica-02
)にDDL操作のスキップを要求するプロセスでは、対応するDMワーカーが再起動されたため、DMワーカーがDDL操作をスキップした後、チェックポイントの更新に失敗します。
mysql-replica-02
の復元に対応するデータ移行サブタスクの後、DMマスターに新しいロックが作成されますが、他のMySQLソースがDDL操作を実行またはスキップし、後続の移行を実行しています。
操作プロセスは次のとおりです。
shard-ddl-lock
を使用して、対応するDDLのロックがDM-master
に存在するかどうかを確認します。mysql-replica-02
だけがsynced
の状態にあります。» shard-ddl-lock { "result": true, "msg": "", "locks": [ { "ID": "test-`shard_db`.`shard_table`", "task": "test", "mode": "pessimistic" "owner": "mysql-replica-02", "DDLs": [ "USE `shard_db`; ALTER TABLE `shard_db`.`shard_table` ADD COLUMN `c2` int(11);" ], "synced": [ "mysql-replica-02" ], "unsynced": [ "mysql-replica-01" ] } ] }
shard-ddl-lock
を使用してDM-master
にロックのロックを解除するように依頼します。ロック解除プロセス中に、所有者はダウンストリームに対してDDL操作を再度実行しようとします(再起動する前の元の所有者は、ダウンストリームに対してDDL操作を1回実行しました)。 DDL操作を複数回実行できることを確認してください。
shard-ddl-lock unlock test-`shard_db`.`shard_table` { "result": true, "msg": "", }
shard-ddl-lock
を使用して、DDLロックが正常にロック解除されたかどうかを確認します。query-status
を使用して、移行タスクが正常かどうかを確認します。
影響
ロックを手動でロック解除した後、次のシャーディングDDLを自動的かつ通常どおりに移行できます。