O ApsaraDB RDS for PostgreSQL não concede privilégios de superusuário, que são exigidos pelo comando COPY no lado do servidor. Use o meta-comando \copy do psql — ele roda no lado do cliente e não requer privilégios de superusuário.
Por que esse erro ocorre
ERROR: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
O comando padrão COPY lê e grava arquivos diretamente no servidor de banco de dados, exigindo privilégios de superusuário para acessar esses caminhos no servidor. Como o ApsaraDB RDS for PostgreSQL não oferece suporte a acesso de superusuário, o comando sempre falha ao referenciar um caminho de arquivo.
Corrigir o erro
Use o meta-comando \copy do psql. Ao contrário do COPY, o \copy roteia os dados pelo cliente (sua máquina local) em vez de ler arquivos no servidor. O acesso aos arquivos e os privilégios são os do usuário local — sem necessidade de privilégios de superusuário.
Execute o seguinte comando dentro do shell do psql:
\copy <table_name> (<column1>, <column2>, ...) FROM '<path/to/file.csv>' WITH CSV
Exemplo usando a tabela do erro original:
\copy mp3 (NAME,city,nation,lat,lng,url,mediatype,type) FROM '/home/alex/tmp/pos.csv' WITH CSV
Se o comando for executado com êxito, o psql exibe o número de linhas importadas:
COPY 42
Alternativa: redirecionar um arquivo CSV pelo psql
Para automatizar a importação em scripts ou quando não for possível usar o shell interativo do psql, redirecione o arquivo via stdin:
cat <table_name>.csv | psql -h <host> -p <port> -U <username> -c "COPY <table_name> FROM STDIN"
Substitua os seguintes marcadores pelos valores reais:
|
Marcador |
Descrição |
|
|
Nome da tabela de destino no banco de dados |
|
|
Hostname ou endereço IP da sua instância RDS |
|
|
Número da porta da sua instância RDS |
|
|
Nome de usuário utilizado para acessar a instância RDS |
Para grandes volumes de dados, essa abordagem transfere todos os dados pela conexão cliente-servidor, o que pode ser mais lento do que um COPY direto no servidor. Nesses casos, considere usar pg_dump e pg_restore.
Próximos passos
Para migrar dados de uma instância PostgreSQL autogerenciada para o ApsaraDB RDS for PostgreSQL, consulte Usar pg_dump e pg_restore para migrar dados de uma instância PostgreSQL autogerenciada para uma instância do ApsaraDB RDS for PostgreSQL.