概要
goInceptionは、MySQLエコシステム向けのSQLレビューおよび運用保守ツールであり、SQLレビュー、実行、バックアップ、およびロールバックステートメントの生成などの機能をサポートしています。実行予定のSQLに対して構文解析とルール検証を行い、goInceptionはレビュー結果を返すとともに、変更の実行(つまり、実行、バックアップ、およびロールバックステートメントの生成をサポートする)操作も可能です。 本記事では、goInceptionを使用してOceanBaseデータベースに接続し、SQLレビュー、実行、およびDDL変更管理を行う方法について説明します。
バージョン互換性
- OceanBaseデータベースのバージョン:V4.2.5以上、V4.3.5 BP2以上、V4.4.0以上。
- OBProxyのバージョン:V4.3.1以上。
前提条件
goInceptionを使用する前に、次のことを確認してください:
- OceanBaseデータベースのデプロイが完了し、MySQLモードのユーザーテナントが作成されていること。テナント作成の詳細については、テナントの作成を参照してください。
- OBProxyがデプロイ済みで、バージョンがV4.3.1以上であること。
- 作成したMySQL互換モードのテナントでBinlogサービスが有効になっていること。詳細については、OceanBase Binlogサービスを参照してください。
- データベースユーザーがターゲットに対してALL権限を持っていること。
- Go言語環境 1.22+とMakeビルドツールがインストールされていること。
- Python 3.10+とpipがインストールされていること。
手順
ステップ1:データベース接続文字列の取得
OceanBaseデータベースのデプロイ担当者から接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:接続IPアドレス。ODP接続はODPアドレスを使用し、直接接続はOBServer IPを使用します。$port:接続ポート番号。ODPのデフォルトは2883、直接接続のデフォルトは2881です。$database_name:データベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。その他のユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:接続アカウント。ODP形式:ユーザー@テナント#クラスタまたはクラスタ:テナント:ユーザー、直接接続形式:ユーザー@テナント。$password:アカウントのパスワード。
その他の接続文字列の情報については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:goInceptionのデプロイ
OceanBase組織内のgoInceptionリポジトリをクローンします:
git clone -b Integration https://github.com/oceanbase/goInception.git cd goInceptionparserをコンパイルします:
make parser #国内Goモジュールミラー #GOPROXY=https://goproxy.cn,direct GO111MODULE=on make parsergoInceptionをビルドします:
go build -o goInception tidb-server/main.gogoInceptionを起動します:
cp config/config.toml.default config/config.toml ./goInception -config=config/config.toml
ステップ3:バックアップとロールバック
バックアップとロールバック機能を使用する場合は、config.tomlにデータベースのバックアップ情報を設定してください:
[inc]
backup_host = "$backup_host"
backup_port = $backup_port
backup_user = "$backup_user"
backup_password = "$backup_password"
- バックアップサーバーでは、バックアップデータベースの命名規則はIP_PORT_データベース名となります。例:127_0_0_1_3306_test。
- バックアップデータベース上に、実行情報とロールバックステートメント情報を保存するためのバックアップ情報テーブル$$Inception_backup_information$$を作成します。
- バックアップデータベースユーザーには、CREATE、INSERT権限が必要です(バックアップ機能を正常に保証するため、すべての権限を付与することを推奨します)。
- データベースのアドレス、ポート番号、ユーザー名、パスワードの取得方法については、ステップ1を参照してください。
ステップ4:DDL変更ツール
DDL変更ツールを使用する必要がある場合、goInceptionはgh-ostとpt-online-schema-change(以下、pt-oscと略称)の2つのツールを提供しています。
gh-ostの使用
gh-ostをインストールします(バイナリ方式)。インストーラーはサポートチームにお問い合わせください。
goInceptionの設定ファイルを修正し、gh-ostを有効化します:
# OSCのスイッチです。0に設定すると、すべてのALTER文がOSCを経由します。非0に設定すると、このテーブルの使用済み容量がこの値を超えた場合にのみOSC方式を使用します。 osc_min_table_size = 0 ghost_on = true ghost_bin_dir = "/path/to/gh-ost/bin/" enable_set_charset = true # テーブルとデータベースの文字セットの指定を許可する check_column_position_change = true # 列の位置/順序の変更をチェックする
pt-oscの使用
pt-oscをインストールします(バイナリ方式)。インストーラーはサポートチームにお問い合わせください。
goInceptionの設定ファイルを修正し、pt-oscを有効化します:
# OSCのスイッチです。0に設定すると、すべてのALTER文がOSCを経由します。非0に設定すると、このテーブルの使用済み容量がこの値を超えた場合にのみOSC方式を使用します。 osc_min_table_size = 0 osc_on = true osc_bin_dir = "/path/to/pt-osc/bin/" enable_set_charset = true # テーブルとデータベースの文字セットの指定を許可する check_column_position_change = true # 列の位置/順序の変更をチェックする
ステップ5:goInceptionを使用してSQLを実行する
以下のPythonスクリプトを使用してgoInceptionに接続し、SQL文を実行します:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import pymysql
import prettytable as pt
tb = pt.PrettyTable()
# 重要:実際の環境に応じて、ターゲットデータベースの接続パラメータを変更してください。
sql = '''/*--user=$user_name;--password=$password;--host=$host;--port=$port;--execute=1;--backup=1;--ignoreWarnings=1*/
inception_magic_start;
use $database_name;
inception set enable_drop_table = true;
inception set enable_null_index_name = true;
ALTER TABLE t1 ADD COLUMN age int(3) DEFAULT 0;
inception_magic_commit;'''
conn = pymysql.connect(host='127.0.0.1', user='', passwd='',
db='', port=4000, charset="utf8mb4")
cur = conn.cursor()
ret = cur.execute(sql)
result = cur.fetchall()
cur.close()
conn.close()
tb.field_names = [i[0] for i in cur.description]
for row in result:
tb.add_row(row)
print(tb)
データベースのアドレス、ポート番号、データベース名、ユーザー名、パスワードの取得については、ステップ1を参照してください。
ターゲットデータベースにログインし、SHOW PROCESSLIST を実行してDDL実行プロセスを確認します:
#mysql -h$host -u$user_name -P$port -p -e 'SHOW PROCESSLIST;'
MySQL [test]> SHOW PROCESSLIST;
+--------+------+-----------------+------+---------+------+--------+-------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------------+------+---------+------+--------+-------------------------------------------------------------+
| 301303 | root | 127.0.0.1:35888 | test | Sleep | 2 | SLEEP | NULL |
| 354271 | root | 127.0.0.1:35956 | test | Sleep | 1 | SLEEP | NULL |
| 334576 | root | 127.0.0.1:35902 | test | Sleep | 2 | SLEEP | NULL |
| 347001 | root | 127.0.0.1:35948 | test | Query | 0 | ACTIVE | create /* gh-ost */ table `test`.`_t1_gho` like `test`.`t1` |
| 268832 | root | 127.0.0.1:44426 | test | Query | 0 | ACTIVE | SHOW PROCESSLIST |
| 314258 | root | 127.0.0.1:35892 | NULL | Sleep | 3 | SLEEP | NULL |
| 340404 | root | 127.0.0.1:35940 | NULL | Sleep | 1 | SLEEP | NULL |
| 319760 | root | 127.0.0.1:35896 | test | Sleep | 2 | SLEEP | NULL |
+--------+------+-----------------+------+---------+------+--------+-------------------------------------------------------------+
8 rows in set (0.02 sec)
MySQL [test]> SHOW PROCESSLIST;
+--------+------+-----------------+------+---------+------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------------+------+---------+------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 301303 | root | 127.0.0.1:35888 | test | Sleep | 3 | SLEEP | NULL |
| 354271 | root | 127.0.0.1:35956 | test | Sleep | 1 | SLEEP | NULL |
| 334576 | root | 127.0.0.1:35902 | test | Sleep | 2 | SLEEP | NULL |
| 347001 | root | 127.0.0.1:35948 | test | Query | 0 | ACTIVE |
insert /* gh-ost */
into
`test`.`_t1_ghc`
(id, hint, value)
values
(NULLIF(2, 0), 'state', 'GhostTableMigrated')
on duplicate key update
last_update=NOW(),
value=VALUES(value) |
| 268832 | root | 127.0.0.1:44426 | test | Query | 0 | ACTIVE | SHOW PROCESSLIST |
| 314258 | root | 127.0.0.1:35892 | NULL | Sleep | 3 | SLEEP | NULL |
| 340404 | root | 127.0.0.1:35940 | NULL | Sleep | 2 | SLEEP | NULL |
| 319760 | root | 127.0.0.1:35896 | test | Sleep | 3 | SLEEP | NULL |
+--------+------+-----------------+------+---------+------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
8 rows in set (0.02 sec)
詳細を見る
- より詳細なサポートが必要な場合は、OceanBaseテクニカルサポートチームにお問い合わせください。