O PolarDB for MySQL permite exportar uma tabela local para o Object Storage Service (OSS) com vários workers paralelos, o que reduz significativamente o tempo de exportação de grandes conjuntos de dados.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster PolarDB for MySQL executando a Enterprise Edition, com número de revisão 8.0.1.1.38 ou posterior (versão 8.0.1) ou 8.0.2.2.25 ou posterior (versão 8.0.2).
Um bucket do OSS e um servidor OSS configurados no cluster. Para instruções de configuração, consulte Usar tabelas externas do OSS para acessar dados do OSS.
(Recomendado) Uma conexão com um nó somente leitura. Execute tarefas de exportação em um nó somente leitura para evitar impacto no nó primário. Adicione a dica
/*FORCE_SLAVE*/à instrução SQL ou conecte-se diretamente a um nó somente leitura.
Limitações
Somente consultas de tabela única (
SELECT * FROM table) admitem exportação paralela. Consultas comJOIN,ORDER BYouGROUP BYnão são elegíveis para exportação paralela.
Sintaxe
SELECT [/*+parallel(N)*/] * FROM table_name
INTO OSSOUTFILE 'outfile_path'
[COLUMNS TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[NULL_MARKER BY 'string' | ESCAPED BY 'char']
[LINES TERMINATED BY 'string'];
Para acionar a exportação paralela, adicione a dica /*+parallel(N)*/, em que N é o número de workers paralelos. Alternativamente, ative o recurso de consulta paralela elástica para que o banco de dados determine automaticamente o grau de paralelismo. Para mais informações, consulte Visão geral.
Para a sintaxe completa do SELECT estendida pela cláusula INTO OSSOUTFILE, consulte a documentação do MySQL.
Cláusulas
|
Cláusula |
Descrição |
|
|
Delimitador entre campos. |
|
|
Caractere inserido em ambas as extremidades de um campo. Com |
|
|
Representação textual de valores NULL. Tem a maior prioridade. Pode ser qualquer string. |
|
|
Prefixo de escape de caractere único. A saída NULL torna-se o caractere de escape seguido por |
|
|
Delimitador entre linhas. |
Parâmetros
|
Parâmetro |
Descrição |
|
|
Caminho de destino no OSS. Consiste em três partes separadas por barras ( |
|
|
Nome da tabela local a exportar. |
Parâmetro global
|
Parâmetro |
Padrão |
Intervalo válido |
Descrição |
|
|
134217728 bytes (128 MiB) |
102400–536870912 bytes |
Memória alocada por thread de worker de exportação paralela. Aumentar esse valor geralmente melhora o throughput de exportação. |
Considerações
Limiar mínimo de dados para exportação paralela
Cada worker deve gravar pelo menos 1.024 KB (pq_oss_min_worker_write_size) de dados. Se a saída estimada por worker ficar abaixo desse limiar, a exportação paralela não será usada. Siga as etapas de solução de problemas abaixo para confirmar se a exportação paralela foi ativada.
Monitorar uma exportação em andamento
Execute os comandos a seguir em uma sessão separada durante a exportação. Ao conectar-se por meio de um endpoint de cluster, execute esses comandos no mesmo nó da instrução de exportação.
-
Memória total usada pela tarefa de exportação atual (bytes):
SHOW STATUS LIKE "%Oss_outfile_memory_used%"; -
Número total de threads de worker de exportação ativas:
SHOW STATUS LIKE "%Oss_outfile_threads_running%";
Exportar uma tabela em paralelo
O exemplo a seguir exporta a tabela lineitem com 4 workers paralelos.
-
Verifique se a consulta suporta execução paralela. Execute
EXPLAINpara confirmar se o planejador consegue paralelizar a varredura:EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;Saída esperada:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5392844 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1348211 | 100.00 | Parallel scan (4 workers) | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+A execução paralela está disponível quando a coluna Extra exibe
Parallel scan. -
Crie um servidor OSS. Ignore esta etapa se já tiver um servidor OSS configurado.
CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "<your-access-key-id>", "oss_access_key_secret": "<your-access-key-secret>", "oss_prefix": "B_outfile"}' );Substitua os valores de espaço reservado pelas credenciais do OSS e informações do bucket.
-
Confirme se a exportação paralela é suportada para esta consulta. Execute
EXPLAINna instrução completa de exportação para garantir que o planejador usará a exportação paralela:EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';Saída esperada:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5805759 | 100.00 | Parallel export OSS outfile | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1451439 | 100.00 | Parallel scan (4 workers); Parallel export OSS outfile | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+A exportação paralela está ativa quando a coluna Extra mostra
Parallel export OSS outfile. Caso não apareça, consulte Solução de problemas. -
Execute a exportação.
SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';Durante a exportação, monitore o uso de recursos em outra sessão com os comandos
SHOW STATUSdescritos em Considerações.
Solução de problemas
Se a saída do EXPLAIN não mostrar Parallel export OSS outfile, use o rastreamento do otimizador para identificar o motivo.
-
Ative o rastreamento do otimizador:
SET optimizer_trace="enabled=on"; -
Execute a instrução a seguir para visualizar os planos de execução das instruções SQL cujos resultados são exportados em paralelo:
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem WHERE l_orderkey < 100 INTO OSSOUTFILE 'default_oss_server/t1' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n'; -
Consulte o resultado do rastreamento:
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; -
Na saída, localize o objeto
considered_parallel_outfilee leia o campocause:"considered_parallel_outfile": { "choose": false, "storage": "OSS", "format": "CSV", "mean_outfile_record_length": "79 B", "estimate_single_worker_outfile_size": "8 KB", "cause": "The data written by each worker should be greater than 1024 KB (pq_oss_min_worker_write_size)." }O campo
causeexplica por que a exportação paralela não foi usada.