Este tópico descreve como converter um banco de dados do modo DRDS para o modo AUTO.
Informações básicas
O PolarDB-X permite converter um banco de dados do modo DRDS para o modo AUTO usando as instruções CREATE DATABASE LIKE ou CREATE DATABASE AS. Para obter mais informações sobre bancos de dados no modo AUTO e no modo DRDS, consulte {{XREF_0}}. Para maior clareza, este tópico refere-se ao banco de dados original no modo DRDS como banco de dados DRDS de origem e ao novo banco de dados no modo AUTO como banco de dados AUTO de destino.
A instrução
create database likeconverte apenas o esquema das tabelas no banco de dados DRDS de origem, sem copiar os dados.A instrução
create database asconverte o esquema das tabelas e copia os dados das tabelas correspondentes.
Pré-requisitos
A versão da instância deve ser 5.4.16-16717637 ou posterior. Para saber como verificar a versão da instância, consulte {{XREF_1}}.
Precauções
O processo de conversão aplica um bloqueio de leitura no banco de dados DRDS de origem. Isso torna o banco somente leitura e bloqueia todas as instruções DML e DDL até que a conversão seja concluída. Portanto, avalie cuidadosamente o possível impacto em seus negócios.
Para evitar falhas na conversão, não execute nenhuma instrução DML ou DDL no banco de dados DRDS de origem ou no banco de dados AUTO de destino durante o processo.
A conversão não exclui nem substitui o banco de dados DRDS de origem. Em vez disso, ela cria um novo banco de dados AUTO de destino a partir do banco de dados DRDS de origem. O acesso ao banco de dados DRDS de origem permanece disponível após a conversão.
Para evitar falhas por falta de espaço de armazenamento, verifique se há espaço suficiente disponível antes de iniciar.
Sintaxe
CREATE DATABASE [IF NOT EXISTS] auto_database_name
as
drds_database_name
[convert_option_list]
convert_option_list:
convert_option [convert_option...] [{include_list|exclude_list}]
convert_option:
mode=auto
| dry_run={true|false}
| lock={true|false}
| create_tables={true|false}
include_list:
include=table_name [,table_name...]
exclude_list:
exclude=table_name [,table_name...]
Parâmetros
|
Parâmetro |
Descrição |
|
auto_database_name |
Nome do novo banco de dados AUTO de destino. |
|
drds_database_name |
Nome do banco de dados DRDS de origem. Este banco de dados já deve existir e estar no modo DRDS. |
|
mode |
Modo do novo banco de dados. Defina este parâmetro como |
|
dry_run |
O parâmetro dry_run fornece uma prévia de como o PolarDB-X converte o esquema das tabelas de um banco de dados DRDS de origem para o modo AUTO. Consulte também {{XREF_2}} para entender como o PolarDB-X executa a conversão. Valores válidos:
Nota
|
|
lock |
O parâmetro lock controla se um bloqueio de leitura será aplicado ao banco de dados DRDS de origem durante a conversão. Um bloqueio de leitura torna o banco de dados DRDS de origem somente leitura e bloqueia todas as operações DML e DDL. Valores válidos:
|
|
create_tables |
O parâmetro create_tables controla se os esquemas de tabela correspondentes serão criados no banco de dados AUTO de destino durante a conversão. Valores válidos:
|
|
include |
O parâmetro include especifica quais tabelas do banco de dados DRDS de origem serão convertidas. Ao definir include, apenas as tabelas listadas nesse parâmetro passam pela conversão. |
|
exclude |
O parâmetro exclude indica quais tabelas não devem participar da conversão. Se você definir exclude, as tabelas especificadas nesse parâmetro serão ignoradas. |
Exemplos
-
Converter o banco de dados
db_drdsdo modo DRDS para o banco de dadosdb_autono modo AUTO. Esta operação converte apenas o esquema das tabelas e não copia dados.CREATE DATABASE db_auto like db_drds mode=auto;A seguinte saída é retornada:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (10 min 32.17 sec) -
Converter o banco de dados
db_drdsdo modo DRDS para o banco de dadosdb_autono modo AUTO. Esta operação converte o esquema das tabelas e copia os dados.CREATE DATABASE db_auto as db_drds mode=auto;A seguinte saída é retornada:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (10 min 37.30 sec) -
Converter e copiar apenas a tabela
tb1do banco de dadosdb_drdsno modo DRDS para o banco de dadosdb_auto_existno modo AUTO.CREATE DATABASE IF NOT EXISTS db_auto_exist as db_drds include=tb1;A seguinte saída é retornada:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (8 min 12.05 sec) -
Visualizar previamente o esquema das tabelas
tb1etb2no banco de dados DRDS de origemdb_drdse o esquema resultante no modo AUTO, sem executar a conversão real.CREATE DATABASE db_auto like db_drds dry_run=true include=tb1,tb2;A seguinte saída é retornada:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TABLE | CREATE_TABLE_DRDS | CREATE_TABLE_AUTO | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb1 | CREATE TABLE `tb1` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`) | CREATE TABLE `tb1` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 PARTITION BY KEY (`id`) PARTITIONS 32 | | tb2 | CREATE TABLE `tb2` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`) | CREATE TABLE `tb2` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 PARTITION BY KEY (`id`) PARTITIONS 32 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.04 sec) -
Copiar apenas os dados do banco de dados DRDS de origem para o banco de dados AUTO de destino, sem converter o esquema das tabelas. Crie previamente o banco de dados AUTO de destino e suas tabelas. Os esquemas das tabelas no banco de dados de destino devem ser idênticos aos do banco de dados de origem.
CREATE DATABASE db_auto as db_drds create_tables=false;A seguinte saída é retornada:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (5 min 47.75 sec)
Visualizar o progresso e os resultados da conversão
PolarDB-X oferece a view INFORMATION_SCHEMA.CREATE_DATABASE, que permite verificar o progresso e os resultados da tarefa de conversão. Por exemplo, execute a seguinte instrução SQL para acompanhar o andamento de uma tarefa cujo banco de dados AUTO de destino é db_auto.
SELECT * FROM INFORMATION_SCHEMA.CREATE_DATABASE where TARGET_SCHEMA = 'db_auto';\G
A seguinte saída é retornada:
*************************** 1. row ***************************
DDL_JOB_ID: 1547426040408715264
SOURCE_SCHEMA: db_drds
TARGET_SCHEMA: db_auto
TABLE/SEQ: tb1
STAGE: BACKFILL
STATUS: RUNNING
DETAIL: NULL
SQL_SRC: CREATE TABLE `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`)
SQL_DST: CREATE TABLE IF NOT EXISTS `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 37632
AVERAGE_SPEED(ROWS/SEC): 216064
FINISHED_ROWS: 216064
APPROXIMATE_TOTAL_ROWS: 1
BACKFILL_PROGRESS: 100%
*************************** 2. row ***************************
DDL_JOB_ID: 1547426040408715264
SOURCE_SCHEMA: db_drds
TARGET_SCHEMA: db_auto
TABLE/SEQ: tb2
STAGE: BACKFILL
STATUS: RUNNING
DETAIL: NULL
SQL_SRC: CREATE TABLE `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`)
SQL_DST: CREATE TABLE IF NOT EXISTS `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 36608
AVERAGE_SPEED(ROWS/SEC): 211968
FINISHED_ROWS: 211968
APPROXIMATE_TOTAL_ROWS: 1
BACKFILL_PROGRESS: 100%
2 rows in set (0.01 sec)
Use também o comando show full ddl para verificar o progresso.
Em tarefas de conversão mais demoradas, caso a conexão seja perdida e você não consiga visualizar o resultado (a tarefa continua executando normalmente mesmo após a perda de conexão), utilize show ddl result para consultar o resultado da conversão. Também é possível obter detalhes adicionais através de INFORMATION_SCHEMA.CREATE_DATABASE.
Conversion time
O tempo de conversão depende principalmente do processo de cópia de dados entre o banco de dados DRDS de origem e o banco de dados AUTO de destino. Em um ambiente de testes com uma instância dedicada do PolarDB-X (CPU de 8 núcleos, 64 GB de memória, 4 nós de computação e 4 nós de armazenamento), criou-se um banco de dados DRDS baseado em {{XREF_3}}. Esse banco continha 4 tabelas, cada uma com 50 milhões de linhas, totalizando aproximadamente 44 GB de dados. A conversão levou 10 minutos e 37 segundos.
O tempo real de conversão varia conforme fatores como as especificações da instância e o tamanho do banco de dados. Para obter uma estimativa mais precisa, recomendamos realizar um teste em horários de baixa demanda ou em um ambiente dedicado. Defina o parâmetro lock como false durante o teste.
Table schema conversion rules
Ao compreender as regras usadas pelo PolarDB-X para converter automaticamente bancos de dados do modo DRDS para o modo AUTO, você consegue avaliar se os bancos e tabelas resultantes convertidos pelo PolarDB-X atendem aos requisitos do seu negócio e fazer os ajustes necessários.
Tabelas únicas e tabelas de broadcast
Tabelas únicas e tabelas de broadcast no modo DRDS são convertidas, respectivamente, para tabelas únicas e tabelas de broadcast no modo AUTO.
Tabelas com sharding de banco de dados e de tabela
-
Tabela de mapeamento de funções.
Tipo de função DRDS
Função de sharding DRDS
Função de particionamento AUTO
Hash
hash(a)
key(a)
str_hash(a, startIdx, endIdx)
key(a)
uni_hash(a)
key(a)
right_shift(a)
key(a)
range_hash(a, b, 10)
co_hash(right(a,n), right(b,n))
Data
YYYYMM(a)
hash(to_months(a))
YYYYWEEK(a)
hash(to_weeks(a))
YYYYDD(a)
hash(to_days(a))
MM(a)
range(month(a))
DD(a)
range(dayofmonth(a))
WEEK(a)
range(dayofweek(a))
MMDD(a)
range(dayofyear(a))
-
Sharding de banco de dados sem sharding de tabela.
# Table in DRDS mode create table tb1 ( id int, name varchar(20) ) dbpartition by uni_hash(id); # Mapped table in AUTO mode create table tb1 ( id int, name varchar(20) ) partition by key(id);NotaConforme ilustrado em {{XREF_4}}:
A função de sharding de banco de dados é convertida em uma função de particionamento.
O esquema da tabela transforma-se em uma tabela particionada de nível 1 no modo AUTO.
-
Sharding de tabela sem sharding de banco de dados.
# Table in DRDS mode create table tb3 ( id int, dt date ) tbpartition by week(dt) tbpartitions 4; # Mapped table in AUTO mode create table tb3 ( id int, dt date ) partition by range (dayofweek(`dt`)) ( partition p2 values less than (2), partition p3 values less than (3), partition p4 values less than (4), partition p5 values less than (5), partition p6 values less than (6), partition pd values less than maxvalue );NotaConforme ilustrado em {{XREF_5}}:
A função de sharding de tabela é convertida para sua função de particionamento correspondente.
O esquema da tabela transforma-se em uma tabela particionada de nível 1 no modo AUTO.
-
Sharding de banco de dados e de tabela com regras idênticas.
# Table in DRDS mode create table tb2 ( buyer_id varchar(20), order_id varchar(20) ) dbpartition by range_hash(buyer_id,order_id, 10) tbpartition by range_hash(buyer_id,order_id, 10) tbpartitions 4; # Mapped table in AUTO mode create table tb2 ( buyer_id varchar(20), order_id varchar(20) ) partition by co_hash(right(buyer_id,10), right(order_id,10)) partitions 64;NotaConforme ilustrado em {{XREF_6}}:
A função de sharding de banco de dados é convertida para sua função de particionamento correspondente.
O número de partições equivale ao produto entre a quantidade de shards de banco de dados e a quantidade de shards de tabela.
O esquema da tabela transforma-se em uma tabela particionada de nível 1 no modo AUTO.
-
Sharding de banco de dados e de tabela com regras diferentes.
# Table in DRDS mode create table tb5 ( buyer_id varchar(20), order_id varchar(20) ) dbpartition by hash(buyer_id) tbpartition by hash(order_id) tbpartitions 4; # Mapped table in AUTO mode create table tb5 ( buyer_id varchar(20), order_id varchar(20) ) partition by key(buyer_id) partitions 16 subpartition by key(order_id) subpartitions 4;NotaConforme ilustrado em {{XREF_7}}:
A função de sharding de banco de dados converte-se na função de particionamento de nível 1 correspondente, e o número de partições de nível 1 iguala-se à quantidade de shards de banco de dados.
A função de sharding de tabela converte-se na função de particionamento de nível 2 correspondente, e o número de partições de nível 2 iguala-se à quantidade de shards de tabela.
O esquema da tabela transforma-se em uma tabela particionada de nível 2 no modo AUTO.
Sequence conversion rules
No modo DRDS, group sequence, time-based sequence e simple sequence são todos convertidos para o tipo New Sequence no modo AUTO, que oferece melhor desempenho geral. Para mais informações, consulte {{XREF_8}}.
Precauções
O banco de dados AUTO de destino deve possuir os mesmos atributos
CHARSETeCOLLATEdo banco de dados DRDS de origem. Por isso, não é permitido especificar manualmenteCHARSETouCOLLATEna instruçãocreate database like/as.O banco de dados AUTO de destino e suas tabelas não herdam o atributo
localitydo banco de dados DRDS de origem e de suas tabelas. Para mais detalhes sobrelocality, consulte {{XREF_9}}.