Todos os produtos
Search
Central de documentação

PolarDB:Acesse dados do OSS usando tabelas externas do OSS

Última atualização: Jun 28, 2026

PolarDB permite consultar diretamente dados formatados em CSV no OSS por meio de tabelas externas, o que reduz seus custos de armazenamento. Este tópico descreve como acessar dados no OSS usando tabelas externas.

Pré-requisitos

Seu cluster PolarDB deve atender a um dos seguintes requisitos:

  • A versão do mecanismo é MySQL 8.0.1 com revisão 8.0.1.1.25.4 ou posterior.

  • A versão do mecanismo é MySQL 8.0.2 com revisão 8.0.2.2.1 ou posterior.

Para verificar a versão do mecanismo, consulte Consultar a versão do mecanismo.

Como funciona

Uma tabela externa do OSS permite armazenar dados formatados em CSV e pouco consultados (conhecidos como dados frios) no OSS, além de possibilitar sua consulta e análise.OSS外表

Limitações

  • Tabelas externas do OSS consultam dados apenas de arquivos CSV.

  • Essas tabelas suportam somente as instruções CREATE, SELECT e DROP.

    Nota

    A operação DROP remove apenas os metadados da tabela no PolarDB, mas não exclui os arquivos de dados no OSS.

  • Não há suporte para índices, particionamento ou transações em tabelas externas do OSS.

  • Os tipos de dados compatíveis para informações em formato CSV incluem tipos numéricos, tipos de data e hora, tipos de string e valores NULL.

    Nota
    • Tipos de dados geoespaciais não são suportados.

    • Arquivos CSV compactados não podem ser consultados.

    • Valores NULL são aceitos apenas se uma das condições abaixo for atendida:

      • A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.

      • A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.

    Tipos numéricos

    Tipo

    Tamanho

    Intervalo com sinal

    Intervalo sem sinal

    Descrição

    TINYINT

    1 byte

    -128 a 127

    0 a 255

    Um inteiro muito pequeno.

    SMALLINT

    2 bytes

    -32768 a 32767

    0 a 65535

    Um inteiro pequeno.

    MEDIUMINT

    3 bytes

    -8388608 a 8388607

    0 a 16777215

    Um inteiro de tamanho médio.

    INT ou INTEGER

    4 bytes

    -2147483648 a 2147483647

    0 a 4294967295

    Um inteiro padrão.

    BIGINT

    8 bytes

    -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

    0 a 18.446.744.073.709.551.615

    Um inteiro grande.

    FLOAT

    4 bytes

    -3,402823466E+38 a -1,175494351E-38; 0; 1,175494351E-38 a 3,402823466E+38

    0; 1,175494351E-38 a 3,402823466E+38

    Um número de ponto flutuante de precisão simples.

    DOUBLE

    8 bytes

    -1,7976931348623157E+308 a -2,2250738585072014E-308; 0; 2,2250738585072014E-308 a 1,7976931348623157E+308

    0; 2,2250738585072014E-308 a 1,7976931348623157E+308

    Um número de ponto flutuante de precisão dupla.

    DECIMAL

    Para DECIMAL(M,D), o tamanho é M+2 bytes se M > D, ou D+2 bytes caso contrário.

    Depende dos valores de M e D.

    Depende dos valores de M e D.

    Um número decimal.

    Tipos de data e hora

    Tipo

    Tamanho

    Intervalo

    Formato

    Descrição

    DATE

    3 bytes

    1000-01-01 a 9999-12-31

    AAAA-MM-DD

    Um valor de data.

    TIME

    3 bytes

    -838:59:59 a 838:59:59

    HH:MM:SS

    Um valor de hora ou duração.

    YEAR

    1 byte

    1901 a 2155

    AAAA

    Um valor de ano.

    DATETIME

    8 bytes

    1000-01-01 00:00:00 a 9999-12-31 23:59:59

    AAAA-MM-DD HH:MM:SS

    Um valor combinado de data e hora.

    Nota

    Para este tipo de dado, o mês e o dia devem ter dois dígitos. Por exemplo, especifique 2020-01-01 em vez de 2020-1-1. Caso contrário, a consulta falhará ao ser enviada para o OSS.

    TIMESTAMP

    4 bytes

    1970-01-01 00:00:00 a 2038-01-19 03:14:07

    AAAA-MM-DD HH:MM:SS

    Um carimbo de data/hora, que é um valor combinado de data e hora.

    Nota

    Para este tipo de dado, o mês e o dia devem ter dois dígitos. Por exemplo, especifique 2020-01-01 em vez de 2020-1-1. Caso contrário, a consulta falhará ao ser enviada para o OSS.

    Tipos de string

    Tipo

    Tamanho

    Descrição

    CHAR

    0 a 255 bytes

    Uma string de comprimento fixo.

    VARCHAR

    0 a 65.535 bytes

    Uma string de comprimento variável.

    TINYBLOB

    0 a 255 bytes

    Uma string binária com comprimento máximo de 255 caracteres.

    TINYTEXT

    0 a 255 bytes

    Uma string de texto curta.

    BLOB

    0 a 65.535 bytes

    Dados de texto longo em formato binário.

    TEXT

    0 a 65.535 bytes

    Dados de texto longo.

    MEDIUMBLOB

    0 a 16.777.215 bytes

    Dados de texto de comprimento médio em formato binário.

    MEDIUMTEXT

    0 a 16.777.215 bytes

    Dados de texto de comprimento médio.

    LONGBLOB

    0 a 4.294.967.295 bytes

    Dados de texto extra grandes em formato binário.

    LONGTEXT

    0 a 4.294.967.295 bytes

    Dados de texto extra grandes.

    Valores NULL

    Inserção

    • Insira um valor NULL em uma tabela externa do OSS.

      Para inserir um valor NULL em uma tabela externa do OSS, especifique o marcador de valor NULL correspondente, NULL_MARKER, ao criar a tabela. O NULL_MARKER de uma tabela externa do OSS tem como padrão NULL. Execute a instrução SHOW CREATE TABLE para visualizar o marcador de valor NULL:

      SHOW CREATE TABLE t1;

      O seguinte resultado é retornado:

      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | Table | Create Table                                                                                                                                                                      |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | t1    | CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL
      ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
    • Insira um valor NULL em um arquivo CSV.

      Se você inserir NULL_MARKER em um campo de um arquivo CSV e NULL_MARKER não estiver entre aspas duplas, o PolarDB reconhecerá o valor como NULL.

      Nota
      • Caso adicione aspas duplas ao redor de NULL_MARKER, o PolarDB o reconhece como uma string. Consequentemente, não é possível usar a instrução is_null para encontrar valores NULL, e um erro será reportado se o parâmetro atribuído ao valor NULL no arquivo CSV não corresponder ao tipo de dado do parâmetro correspondente na tabela externa do OSS.

      • O NULL_MARKER não pode ser um valor numérico, uma string vazia ou conter qualquer um dos seguintes caracteres:

        ", \n, \r e ,

      Exemplo

      Use a seguinte instrução para criar uma tabela externa do OSS:

      CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `time` timestamp NULL DEFAULT NULL
      ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';

      Suponha que o arquivo de dados contenha o seguinte conteúdo:

      1,"xiaohong","2022-01-01 00:00:00"
      NULL,"xiaoming","2022-02-01 00:00:00"
      3,NULL,"2022-03-01 00:00:00"
      4,"xiaowang",NULL

      A consulta à tabela externa do OSS retorna os seguintes dados:

      SELECT * FROM t1;
      +------+----------+---------------------+
      | id   | name     | time                |
      +------+----------+---------------------+
      |    1 | xiaohong | 2022-01-01 00:00:00 |
      | NULL | xiaoming | 2022-02-01 00:00:00 |
      |    3 | NULL     | 2022-03-01 00:00:00 |
      |    4 | xiaowang | NULL                |
      +------+----------+---------------------+

    Leitura

    • Ao ler dados de um arquivo CSV, se um valor no arquivo for NULL e a coluna correspondente na tabela externa do OSS aceitar NULL, a coluna será definida como NULL.

    • Se um valor NULL for lido de um arquivo CSV para uma coluna definida como NOT NULL, ocorrerá um conflito. O resultado depende do modo SQL.

      • Se o sql_mode estiver definido como STRICT_TRANS_TABLES, um erro será reportado.

      • Se o sql_mode estiver definido como um modo diferente de STRICT_TRANS_TABLES, a coluna assumirá seu valor padrão definido. Se nenhum valor padrão estiver definido, ela assumirá o padrão do MySQL para seu tipo de dado. Para mais informações, consulte Valores padrão de tipos de dados. Um aviso também é retornado. Use o comando SHOW WARNINGS; para visualizar os detalhes do aviso.

    Nota

    Use o comando SHOW VARIABLES LIKE "sql_mode"; para visualizar o modo SQL atual. Você também pode acessar o console do PolarDB e modifique o parâmetro sql_mode na página Settings and Management > Parameters. Para mais informações, consulte Modificar parâmetros.

    Exemplo

    Crie uma tabela externa do OSS chamada t onde a coluna id esteja definida como NOT NULL e não tenha valor padrão.

    CREATE TABLE `t` (
      `id` int(11) NOT NULL
    ) ENGINE=CSV 
    CONNECTION="server_name";

    Suponha que o arquivo CSV t.CSV contenha o seguinte conteúdo:

    NULL
    2

    Dois cenários podem ocorrer ao ler dados do arquivo CSV usando a tabela externa do OSS:

    • Se sql_mode estiver definido como STRICT_TRANS_TABLES, execute o seguinte comando para consultar dados do arquivo CSV:

      SELECT * FROM t;

      A seguinte mensagem de erro é reportada:

      ERROR 1364 (HY000): Field 'id' doesn't have a default value
    • Se sql_mode estiver definido como um modo diferente de STRICT_TRANS_TABLES, execute o seguinte comando para consultar dados do arquivo CSV:

      SELECT * FROM t;

      O seguinte resultado é retornado:

      +----+
      | id |
      +----+
      |  0 |
      |  2 |
      +----+
      2 rows in set, 1 warning (0.00 sec)

      No resultado, 0 é o valor padrão do MySQL. Execute o seguinte comando para visualizar a mensagem de aviso:

      SHOW WARNINGS;

      O seguinte resultado é retornado:

      +---------+------+-----------------------------------------+
      | Level   | Code | Message                                 |
      +---------+------+-----------------------------------------+
      | Warning | 1364 | Field 'id' doesn't have a default value |
      +---------+------+-----------------------------------------+
      1 row in set (0.00 sec)

Parâmetros

Visualize ou modifique os seguintes parâmetros na página Settings and Management > Parameters no console do PolarDB:

Parâmetro

Escopo

Descrição

loose_csv_oss_buff_size

Sessão

Define a quantidade de memória em bytes que uma única thread do OSS pode usar. O valor padrão é 134217728.

Valores válidos: 4096 a 134217728

loose_csv_max_oss_threads

Global

Define o número máximo de threads simultâneas do OSS. O valor padrão é 1.

Valores válidos: 1 a 100

A memória total máxima para o recurso do OSS é calculada como: loose_csv_max_oss_threads * loose_csv_oss_buff_size.

Nota

Para evitar problemas de falta de memória, a memória total para o recurso do OSS não deve exceder 5% da memória do nó atual.

Procedimento

Criar um servidor OSS

Crie um servidor OSS para adicionar informações de conexão e conectar-se ao OSS.

Nota

Por motivos de segurança, criar um servidor OSS é o único método suportado para se conectar ao OSS.

Versões mais recentes

Se o seu cluster de banco de dados atender a uma das seguintes condições, use a sintaxe abaixo:

  • A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.

  • A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.

CREATE SERVER <server_name> 
FOREIGN DATA WRAPPER oss OPTIONS 
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);
Nota
  • O parâmetro opcional DATABASE equivale a oss_prefix. Recomendamos o uso de oss_prefix.

  • Para usar o parâmetro oss_sts_token, uma das seguintes condições deve ser atendida:

    • A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.29 ou posterior.

    • A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.6 ou posterior.

A tabela a seguir descreve os parâmetros.

Parâmetro

Tipo

Obrigatório

Descrição

server_name

String

Sim

O nome do servidor OSS.

Nota

Este parâmetro é global e deve ser único. O nome não diferencia maiúsculas de minúsculas e tem um comprimento máximo de 64 caracteres. Nomes com mais de 64 caracteres são truncados automaticamente. É possível especificar o nome do servidor OSS como uma string entre aspas.

my_database_name

String

Não

O diretório no OSS que contém os arquivos de dados CSV.

Nota

Se ambos os parâmetros DATABASE e my_oss_prefix forem especificados, o PolarDB buscará arquivos no caminho my_oss_prefix/DATABASE. Para mais informações sobre como adicionar o parâmetro DATABASE, veja o conteúdo abaixo.

my_oss_endpoint

String

Sim

O endpoint para a região correspondente do OSS.

Nota

Se você acessar o banco de dados a partir de um host da Alibaba Cloud, use um endpoint interno, que contém "internal" em seu nome, para evitar tráfego de rede pública.

Por exemplo, o endpoint interno para a região China (Hangzhou) é oss-cn-hangzhou-internal.aliyuncs.com.

my_oss_bucket

String

Sim

O bucket do OSS onde os arquivos de dados estão armazenados. Crie esse bucket no OSS antecipadamente.

Nota

Para melhor desempenho, coloque o bucket do OSS e o cluster de banco de dados PolarDB na mesma zona de disponibilidade para reduzir a latência de rede.

my_oss_access_key_id

String

Sim

O AccessKey ID de um usuário RAM ou de uma conta Alibaba Cloud.

my_oss_access_key_secret

String

Sim

O AccessKey Secret de um usuário RAM ou de uma conta Alibaba Cloud.

my_oss_prefix

String

Não

O diretório no OSS que contém os arquivos de dados CSV.

my_oss_sts_token

String

Não

A credencial de acesso temporário STS.

Nota
  • Este parâmetro é necessário quando você usa uma credencial de acesso temporário STS para acessar o OSS.

  • O parâmetro my_oss_sts_token possui um tempo de expiração padrão. Se my_oss_sts_token tiver expirado, execute o seguinte comando para redefinir todos os valores de parâmetros em EXTRA_SERVER_INFO.

    ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
        "oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
        "oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

Versões anteriores

Se o seu cluster de banco de dados atender a uma das seguintes condições, use a sintaxe abaixo:

  • A versão do kernel é MySQL 8.0.1 e a revisão está entre 8.0.1.1.25.4 e 8.0.1.1.27.

  • A versão do kernel é MySQL 8.0.2 e a revisão está entre 8.0.2.2.1 e 8.0.2.2.4.

CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
);                  
Nota

Nesta versão, a sintaxe não suporta os parâmetros oss_prefix e oss_sts_token.

A tabela a seguir descreve os parâmetros.

Parâmetro

Tipo

Obrigatório

Descrição

server_name

String

Sim

O nome do servidor OSS.

Nota

Este parâmetro é global e deve ser único. O nome não diferencia maiúsculas de minúsculas e tem um comprimento máximo de 64 caracteres. Nomes com mais de 64 caracteres são truncados automaticamente. É possível especificar o nome do servidor OSS como uma string entre aspas.

my_database_name

String

Não

O nome do diretório no OSS que contém os arquivos de dados CSV.

my_oss_endpoint

String

Sim

O endpoint para a região correspondente do OSS.

Nota

Se você acessar o banco de dados a partir de um host da Alibaba Cloud, use um endpoint interno, que contém "internal" em seu nome, para evitar tráfego de rede pública.

Exemplo: oss-cn-hangzhou-internal.aliyuncs.com

my_oss_bucket

String

Sim

O bucket do OSS onde os arquivos de dados estão armazenados. Crie o bucket no OSS antecipadamente.

my_oss_access_key_id

String

Sim

O AccessKey ID de um usuário RAM ou de uma conta Alibaba Cloud.

my_oss_access_key_secret

String

Sim

O AccessKey Secret de um usuário RAM ou de uma conta Alibaba Cloud.

Nota

Criar um servidor OSS requer a permissão SERVERS_ADMIN. Execute o comando SHOW GRANTS FOR <username>; para verificar se o usuário atual possui a permissão SERVERS_ADMIN. Atualmente, contas com altos privilégios têm essa permissão por padrão e podem concedê-la a contas com privilégios padrão.

  • Se você não tiver o privilégio SERVERS_ADMIN, o seguinte erro será retornado: Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation.

  • Caso utilize uma conta padrão sem o privilégio SERVERS_ADMIN, uma conta com altos privilégios pode conceder o privilégio executando: GRANT SERVERS_ADMIN ON *.* TO .

  • Se você tiver uma conta com altos privilégios, mas não possuir a permissão SERVERS_ADMIN, acesse a página Settings and Management > Accounts no console do PolarDB e redefina as permissões. Aguarde um período e verifique a conta com altos privilégios novamente. A conta receberá então a permissão SERVERS_ADMIN. Se a conta com altos privilégios ainda não tiver a permissão SERVERS_ADMIN após tentar essas etapas, abra um ticket para entrar em contato conosco ou busque nosso número de grupo no DingTalk.

  • Uma conta com altos privilégios pode visualizar as informações do servidor OSS executando SELECT Server_name, Extra_server_info FROM mysql.servers;. Por segurança, os valores dos parâmetros oss_access_key_id e oss_access_key_secret são criptografados e não podem ser visualizados.

Carregar dados

Utilize a ferramenta de linha de comando ossutil para carregar arquivos CSV locais no Object Storage Service (OSS).

Nota
  • O diretório do OSS onde você carrega o arquivo CSV deve corresponder ao diretório especificado no parâmetro DATABASE ou oss_prefix do servidor OSS.

  • O nome do arquivo CSV carregado deve estar no formato <foreign_table_name>.CSV, com a extensão .CSV em letras maiúsculas. Por exemplo, se a tabela externa do OSS for chamada t1, o arquivo CSV deve ser nomeado t1.CSV.

  • Os campos de dados no arquivo CSV devem corresponder às colunas da tabela externa do OSS. Por exemplo, se a tabela externa do OSS t1 tiver uma única coluna id do tipo INT, o arquivo CSV carregado também deve conter apenas um campo INT.

  • Recomendamos carregar diretamente os arquivos de dados do seu banco de dados MySQL local e criar a tabela externa do OSS correspondente com base na definição da tabela.

Criar uma tabela externa do OSS

Após definir o servidor OSS, crie uma tabela externa do OSS no PolarDB para mapear um arquivo CSV no OSS. Exemplo:

CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";

A connection_string consiste nas seguintes partes, unidas por uma barra (/):

  • O nome do servidor OSS.

  • (Opcional) O caminho para o arquivo de dados no OSS.

    Nota

    O caminho do arquivo de dados é suportado apenas se uma das seguintes condições for atendida.

    • A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.

    • A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.

  • (Opcional) O nome do arquivo de dados.

    Nota
    • Não inclua o sufixo .CSV no nome do arquivo de dados.

    • Se você não especificar um nome de arquivo de dados, o arquivo OSS correspondente à tabela atual será <current_table_name>.CSV. Se especificar um nome de arquivo de dados, o arquivo OSS correspondente será <specified_data_file_name>.CSV.

    • Caso especifique o caminho para o arquivo de dados no OSS, também será necessário especificar o nome do arquivo de dados. Caso contrário, o sistema tratará o último segmento do caminho como o nome do arquivo.

Visualizar tabela externa do OSS

Depois que a tabela externa do OSS for criada, visualize sua definição executando SHOW CREATE TABLE <table_name>;. Verifique se o mecanismo da tabela é CSV (ou seja, ENGINE=CSV). Se não for, a versão do seu cluster de banco de dados PolarDB pode ser muito antiga para suportar o mecanismo OSS. Para mais informações, consulte Pré-requisitos.

Exemplo

CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";

Este exemplo mostra a composição da connection_string:

  • Nome do servidor OSS: server_name.

  • Caminho para o arquivo de dados no OSS: oss_prefix/a/b/c/d/.

  • Arquivo de dados: t1. O arquivo real é t1.CSV, mas o sufixo .CSV é omitido conforme necessário.

Nota

É possível especificar o arquivo de dados para a tabela externa do OSS apenas pelo nome. Por exemplo, na instrução a seguir, o PolarDB busca o arquivo t2.CSV no caminho oss_prefix no OSS.

CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";

Consultar dados

Os exemplos a seguir consultam a tabela t1 criada nas etapas anteriores.

-- Count rows in the t1 table.
SELECT count(*) FROM t1;

-- Range query.
SELECT id FROM t1 WHERE id < 10 AND id > 1;

-- Point query.
SELECT id FROM t1 where id = 3;

-- Multi-table join.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";

A tabela a seguir descreve erros comuns que podem ocorrer durante consultas de dados e suas soluções.

Nota

Se uma consulta retornar um aviso em vez de um erro, execute SHOW WARNINGS; para visualizar os detalhes do aviso.

Mensagem de erro

Causa

Solução

OSS error: No corresponding data file on the OSS engine.

O arquivo de dados correspondente não foi encontrado no OSS.

Verifique se o arquivo de dados existe no caminho esperado no OSS.

  • Se o arquivo existir, confirme se o nome do arquivo segue o formato <foreign_table_name>.CSV e se a extensão .CSV está em letras maiúsculas.

  • Se o arquivo não existir, carregue-o no caminho de destino.

There is not enough memory space for OSS transmission. Currently requested memory %d.

Memória insuficiente para a consulta do OSS.

Para resolver este erro:

  • Acesse a página Parameters no console e aumente o valor do parâmetro loose_csv_max_oss_threads para permitir mais threads do OSS.

  • Execute FLUSH TABLE para liberar threads mantidas por outras tabelas do OSS.

ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80;

O cluster de banco de dados não consegue se conectar ao servidor OSS.

Verifique se a instância de banco de dados e o bucket do OSS estão na mesma zona de disponibilidade.

  • Se não estiverem, coloque a instância de banco de dados e o bucket do OSS na mesma zona de disponibilidade.

  • Se estiverem na mesma zona de disponibilidade, alterne para um endpoint público. Se o erro persistir, entre em contato com o Suporte da Alibaba Cloud.

Otimização de consulta

O mecanismo OSS melhora o desempenho da consulta enviando condições elegíveis para o mecanismo OSS remoto. Essa otimização é chamada de engine condition pushdown. As seguintes limitações se aplicam ao envio de condições:

  • Apenas arquivos de texto CSV codificados em UTF-8 são suportados.

  • Em instruções SQL, apenas os seguintes tipos de operadores e expressões aritméticas são suportados:

    • Operadores de comparação: >, <, >=, <=, ==

    • Operadores lógicos: LIKE, IN, AND, OR

    • Expressões aritméticas: + , - , * , /

  • Apenas consultas de arquivo único são suportadas. Consultas que usam cláusulas JOIN, ORDER BY, GROUP BY ou HAVING não são suportadas.

  • A cláusula WHERE não pode conter operações de agregação. Por exemplo, where max(age) > 100 não é permitido.

  • O número máximo de colunas é 1.000, e o comprimento máximo de um nome de coluna em uma instrução SQL é 1.024 bytes.

  • Em uma cláusula LIKE, até cinco curingas % são suportados.

  • Em uma cláusula IN, até 1.024 constantes são suportadas.

  • Para arquivos CSV, o tamanho máximo é 256 KB por linha e 256 KB por coluna.

  • O comprimento máximo de uma instrução SQL é 16 KB. A cláusula WHERE pode conter até 20 expressões, e uma consulta pode conter até 100 operações de agregação.

Nota

Este recurso está desativado por padrão. Para ativá-lo, execute o comando SET SESSION optimizer_switch='engine_condition_pushdown=on';.

Consultas que atendem a essas condições são enviadas para o mecanismo OSS. Verifique o plano de execução de uma tabela externa do OSS para ver quais condições foram enviadas.

  • Use EXPLAIN para visualizar o plano de execução de uma tabela externa do OSS. Exemplo:

    EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra                                                                                                                            |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15000 |     1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    As condições após With pushed engine condition são enviadas para o mecanismo OSS remoto. As condições restantes, name e GROUP BY , não são enviadas e são executadas apenas no servidor OSS local.

  • Use o formato tree para visualizar o plano de execução de uma tabela externa do OSS. Exemplo:

    EXPLAIN FORMAT=tree  SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                           |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | -> Sort: <temporary>.id DESC
        -> Table scan on <temporary>
            -> Aggregate using temporary table
                -> Filter: (t1.`name` like '%1%%%%%')  (cost=1690.00 rows=185)
                    -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) )  (cost=1690.00 rows=15000)
     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    As condições após engine conditions: são enviadas para o mecanismo OSS remoto. As condições restantes, name e GROUP BY , não são enviadas e são executadas apenas no servidor OSS local.

    Nota

    Seu cluster deve estar executando PolarDB for MySQL 8.0.2 ou posterior. Confirme a versão do cluster seguindo as instruções em Consultar o número da versão.

  • Use o formato JSON para visualizar o plano de execução de uma tabela externa do OSS. Exemplo:

    EXPLAIN FORMAT=json  SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {
      "query_block": {
        "select_id": 1,
        "cost_info": {
          "query_cost": "1875.13"
        },
        "ordering_operation": {
          "using_filesort": false,
          "grouping_operation": {
            "using_temporary_table": true,
            "using_filesort": true,
            "cost_info": {
              "sort_cost": "185.13"
            },
            "table": {
              "table_name": "t1",
              "access_type": "ALL",
              "rows_examined_per_scan": 15000,
              "rows_produced_per_join": 185,
              "filtered": "1.23",
              "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))",
              "cost_info": {
                "read_cost": "1671.49",
                "eval_cost": "18.51",
                "prefix_cost": "1690.00",
                "data_read_per_join": "146K"
              },
              "used_columns": [
                "id",
                "name"
              ],
              "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')"
            }
          }
        }
      }
    } |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    Da mesma forma, as condições no campo engine_condition são enviadas para o mecanismo OSS remoto. As condições restantes, name e GROUP BY , não são enviadas e são executadas apenas no servidor OSS local.

Se você receber o seguinte erro, isso indica que alguns caracteres no arquivo de dados do OSS são incompatíveis com o envio de condições do mecanismo.

OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.

Desative manualmente o envio de condições do mecanismo usando um hint ou optimizer_switch.

  • Hints

    Use um hint para desativar o envio de condições do mecanismo para uma consulta específica. Por exemplo, para desativar o envio de condições do mecanismo para a tabela t1:

    SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;
  • optimizer_switch

    Use optimizer_switch para desativar o envio de condições do mecanismo para todas as consultas na sessão atual.

    SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Disable engine condition pushdown for the current session.

    Para verificar o status do envio de condições do mecanismo na sessão atual, execute o seguinte comando:

    select @@optimizer_switch;

Sincronizar informações do servidor OSS

O nó primário e os nós somente leitura em um cluster PolarDB compartilham um único servidor OSS, permitindo o acesso aos dados a partir de todos os nós. Essa sincronização sem bloqueios garante que as operações em cada nó permaneçam independentes.

Ao modificar as informações do servidor OSS, as alterações são sincronizadas com os nós somente leitura sem bloqueios. Se uma thread em um nó somente leitura mantiver um bloqueio no servidor OSS, essa sincronização poderá ser atrasada. Nesse caso, execute /*force_node='pi-bpxxxxxxxx'*/ flush privileges; ou /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; para atualizar manualmente as informações do servidor OSS do nó somente leitura.