As tabelas externas permitem que o AnalyticDB for MySQL leia dados diretamente de uma instância do RDS for MySQL pela sua VPC. Use essa abordagem para extrair dados de source para o AnalyticDB for MySQL e executar análises complexas. Opcionalmente, grave os resultados resumidos de volta no RDS for MySQL.
Pré-requisitos
Antes de começar, verifique se:
A instância do RDS for MySQL e o cluster do AnalyticDB for MySQL estão na mesma VPC.
O bloco CIDR da VPC onde reside o cluster do AnalyticDB for MySQL foi adicionado à lista de permissões de endereços IP da instância do RDS for MySQL. Sem essa configuração, o AnalyticDB for MySQL não consegue acessar a instância do RDS for MySQL e as consultas à tabela externa falham.
Para clusters das edições Enterprise, Basic, Data Lakehouse ou Data Warehouse em modo elástico: a opção ENI está ativada na seção Network Information da página Cluster Information no console do AnalyticDB for MySQL.
Ativar ou desativar a elastic network interface (ENI) interrompe a conectividade com o banco de dados por aproximadamente dois minutos. Durante esse período, as operações de leitura e gravação ficam indisponíveis. Planeje essa alteração durante uma janela de manutenção.
Dados de exemplo
Os exemplos neste tópico usam um banco de dados do RDS for MySQL chamado test_adb, que contém uma tabela goods:
CREATE TABLE goods (
goods_id bigint(20) NOT NULL,
price double NOT NULL,
class bigint(20) NOT NULL,
name varchar(32) NOT NULL,
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (goods_id)
);
Insira linhas de exemplo para usar nas etapas seguintes:
INSERT INTO test_adb.goods
VALUES
(1, 50, 1, 'Book', '2024-08-07 09:56:53'),
(2, 80, 2, 'Basketball', '2024-08-08 10:00:55'),
(3, 150, 3, 'Watch', '2024-08-06 11:00:25'),
(4, 30, 1, 'Magazine', '2024-08-08 12:25:55'),
(5, 80, 2, 'Football', '2024-08-07 08:50:35'),
(6, 25, 4, 'Tea', '2024-08-05 09:25:30'),
(7, 30, 4, 'Coffee', '2024-08-07 10:20:40'),
(8, 300, 3, 'Computer', '2024-08-06 10:55:35'),
(9, 100, 2, 'Baseball', '2024-08-08 11:35:50'),
(10, 200, 3, 'Phone', '2024-08-07 11:30:25');
Importar dados
As etapas variam conforme a edição do seu cluster.
Enterprise Edition, Basic Edition e Data Lakehouse Edition
Steps overview: Abra o editor SQL → Crie um banco de dados externo → Crie uma tabela externa → Consulte a tabela externa → Crie uma tabela de destino → Importe os dados → Verifique.
-
Abra o editor SQL.
Faça login no console do AnalyticDB for MySQL. No canto superior esquerdo, selecione uma região. No painel de navegação à esquerda, clique em Clusters e, em seguida, clique no ID do seu cluster.
No painel de navegação à esquerda, clique em Job Development > SQL Development.
Selecione o mecanismo XIHE e um grupo de recursos interativo.
-
Crie um banco de dados externo.
CREATE EXTERNAL DATABASE adb_external_db; -
Crie uma tabela externa mapeada para a tabela
goodsno RDS for MySQL.A tabela externa no AnalyticDB for MySQL deve ter os mesmos nomes de colunas, quantidade de colunas, ordem das colunas e tipos de dados da tabela de source no RDS for MySQL.
ImportanteEvite codificar credenciais diretamente em instruções SQL salvas ou compartilhadas. Armazene as credenciais com segurança e substitua-as em tempo de execução sempre que possível.
Espaço reservado
Descrição
<mysql-address>O nome do host do endpoint interno (VPC) da sua instância do RDS for MySQL. Formato:
<hostname>:3306. Para localizar seu endpoint, consulte Visualize ou modifique endpoints e portas internos e públicos.<mysql-user-name>A conta de banco de dados da instância do RDS for MySQL.
<mysql-user-password>A senha da conta de banco de dados.
Parâmetro
Descrição
urlO endpoint da VPC da instância do RDS for MySQL e o nome do banco de dados de source. Formato:
"jdbc:mysql://<hostname>:3306/<database-name>".tablenameO nome da tabela de source no RDS for MySQL.
usernameA conta de banco de dados da instância do RDS for MySQL.
passwordA senha da conta de banco de dados.
charsetO conjunto de caracteres. Valores válidos:
gbk,utf8(padrão),utf8mb4.CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_db.goods ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) ENGINE = 'MYSQL' TABLE_PROPERTIES = '{ "url":"jdbc:mysql://<mysql-address>:3306/test_adb", "tablename":"goods", "username":"<mysql-user-name>", "password":"<mysql-user-password>", "charset":"utf8" }';Substitua os seguintes espaços reservados. Principais parâmetros em
TABLE_PROPERTIES: Para a sintaxe completa deCREATE EXTERNAL TABLE, consulte CREATE EXTERNAL TABLE. -
Verifique a tabela externa consultando dados do RDS for MySQL pelo AnalyticDB for MySQL.
SELECT * FROM adb_external_db.goods;Saída esperada:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+ -
Crie um banco de dados e uma tabela de destino no AnalyticDB for MySQL para armazenar os dados importados.
CREATE DATABASE adb_demo;CREATE TABLE IF NOT EXISTS adb_demo.mysql_import_test ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) DISTRIBUTED BY HASH(goods_id); -
Importe os dados da tabela externa para a tabela de destino.
INSERT INTO adb_demo.mysql_import_test SELECT * FROM adb_external_db.goods; -
Verifique a importação.
SELECT * FROM adb_demo.mysql_import_test;Saída esperada:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+
Data Warehouse Edition
Steps overview: Conecte-se ao cluster → Crie um banco de dados de destino → Crie uma tabela externa → Crie uma tabela de destino → Importe os dados → Verifique.
Conecte-se ao cluster do AnalyticDB for MySQL. Para mais detalhes, consulte Conectar-se a um cluster.
Crie um banco de dados de destino. Para mais detalhes, consulte Criar um banco de dados. Neste exemplo, o banco de dados de destino chama-se
adb_demo.-
Crie uma tabela externa em
adb_demomapeada para a tabelagoodsno RDS for MySQL.ImportanteEvite codificar credenciais diretamente em instruções SQL salvas ou compartilhadas. Armazene as credenciais com segurança e substitua-as em tempo de execução sempre que possível.
Parâmetro
Descrição
ENGINE='mysql'Defina o MySQL como o mecanismo de armazenamento da tabela externa.
TABLE_PROPERTIESUm objeto JSON que define como o AnalyticDB for MySQL se conecta ao RDS for MySQL.
urlO endpoint da VPC da instância do RDS for MySQL e o nome do banco de dados de source. Formato:
"jdbc:mysql://<hostname>:3306/<database-name>". Para localizar seu endpoint, consulte Visualize ou modifique endpoints e portas internos e públicos.tablenameO nome da tabela de source no RDS for MySQL.
usernameA conta de banco de dados da instância do RDS for MySQL.
passwordA senha da conta de banco de dados.
charsetO conjunto de caracteres. Valores válidos:
gbk,utf8(padrão),utf8mb4.CREATE TABLE IF NOT EXISTS adb_demo.goods_external_table ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) ENGINE='mysql' TABLE_PROPERTIES='{ "url":"jdbc:mysql://<mysql-vpc-address>:3306/test_adb", "tablename":"goods", "username":"<mysql-user-name>", "password":"<mysql-user-password>", "charset":"utf8" }';Principais parâmetros:
-
Crie uma tabela de destino para armazenar os dados importados.
CREATE TABLE IF NOT EXISTS adb_demo.mysql_import_test ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) DISTRIBUTED BY HASH(goods_id); -
Importe os dados da tabela externa para a tabela de destino.
REPLACE INTO adb_demo.mysql_import_test SELECT * FROM adb_demo.goods_external_table; -
Verifique a importação.
SELECT * FROM adb_demo.mysql_import_test LIMIT 100;Saída esperada:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+
Próximos passos
Para gravar resultados de volta no RDS for MySQL, crie uma tabela externa apontando para a tabela de destino no RDS e use
INSERT INTO ... SELECTpara enviar dados do AnalyticDB for MySQL para o RDS for MySQL.Para a referência completa de DDL de tabelas externas, consulte CREATE EXTERNAL TABLE.