AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 11893
Accepted
Alex
Alex
Asked: 2012-01-31 03:28:09 +0800 CST2012-01-31 03:28:09 +0800 CST 2012-01-31 03:28:09 +0800 CST

Force drop db enquanto outros podem estar conectados

  • 772

Eu preciso remover um banco de dados de um cluster de banco de dados PostgreSQL. Como posso fazer isso mesmo se houver conexões ativas? Eu preciso de uma espécie de -forcesinalizador, que derrubará todas as conexões e, em seguida, o banco de dados.

Como posso implementá-lo?

Estou usando dropdbatualmente, mas outras ferramentas são possíveis.

postgresql maintenance
  • 6 6 respostas
  • 315952 Views

6 respostas

  • Voted
  1. Best Answer
    filiprem
    2012-01-31T03:51:29+08:002012-01-31T03:51:29+08:00

    PostgreSQL 13 adicionado:

    DROP DATABASE mydb WITH (FORCE);
    

    O manual:

    FORCE

    Tente encerrar todas as conexões existentes com o banco de dados de destino. Ele não termina se transações preparadas, slots de replicação lógica ativa ou assinaturas estiverem presentes no banco de dados de destino.

    Isso falhará se o usuário atual não tiver permissões para encerrar outras conexões. As permissões necessárias são as mesmas pg_terminate_backenddescritas na Seção 9.27.2 . Isso também falhará se não pudermos encerrar as conexões.


    No PostgreSQL 12 e versões anteriores , você não pode descartar um banco de dados enquanto os clientes estiverem conectados a ele.

    Pelo menos, não com o dropdbutilitário - que é apenas um wrapper simples em torno da DROP DATABASEconsulta do servidor.

    A solução alternativa bastante robusta segue:

    Conecte-se ao seu servidor como superusuário , usando psqlou outro cliente. Não use o banco de dados que deseja eliminar.

    psql -h localhost postgres postgres
    

    Agora, usando o cliente de banco de dados simples, você pode forçar o descarte do banco de dados usando três etapas simples:

    1. Certifique-se de que ninguém possa se conectar a este banco de dados. Você pode usar um dos seguintes métodos (o segundo parece mais seguro, mas não impede conexões de superusuários).

      /* Method 1: update system catalog */
      UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'mydb';
      
      /* Method 2: use ALTER DATABASE. Superusers still can connect!
      ALTER DATABASE mydb CONNECTION LIMIT 0; */
      
    2. Força a desconexão de todos os clientes conectados a este banco de dados, usando pg_terminate_backend.

       SELECT pg_terminate_backend(pid)
       FROM pg_stat_activity
       WHERE datname = 'mydb';
      
       /* For old versions of PostgreSQL (up to 9.1), change pid to procpid:
      
       SELECT pg_terminate_backend(procpid)
       FROM pg_stat_activity
       WHERE datname = 'mydb'; */
      
    3. Solte o banco de dados.

       DROP DATABASE mydb;
      

    A etapa 1 requer privilégios de superusuário para o primeiro método e privilégios de proprietário do banco de dados para o segundo. A etapa 2 requer privilégios de superusuário . A etapa 3 requer privilégio de proprietário do banco de dados.

    • 300
  2. Erwin Brandstetter
    2012-01-31T08:15:33+08:002012-01-31T08:15:33+08:00

    O Postgres 13 adiciona a FORCEopção para arquivos DROP DATABASE. Veja a resposta de filiprem .

    O utilitário shell dropdbé basicamente apenas um wrapper em torno do comando SQL e herda a mesma opção. Portanto, agora também é simples e confiável do shell:

    dropdb mydb --force
    

    Ou curta:

    dropdb mydb -f
    

    Para Postgres 12 e anteriores , existe uma maneira com os utilitários shell dropdb& pg_ctl(ou pg_ctlclusterno Debian e derivados) também. Mas o método do filiprem é superior por vários motivos:

    • Ele apenas desconecta os usuários do banco de dados em questão.
    • Ele não precisa reiniciar todo o cluster.
    • Impede reconexão imediata, possivelmente estragando o dropdbcomando.

    eu cito man pg_ctlcluster:

    Com a --forceopção, o modo "rápido" é usado, que reverte todas as transações ativas, desconecta os clientes imediatamente e, portanto, encerra de forma limpa. Se isso não funcionar, o desligamento será tentado novamente no modo "imediato", o que pode deixar o cluster em um estado inconsistente e, portanto, levará a uma execução de recuperação na próxima inicialização. Se isso ainda não ajudar, o processo do postmaster é encerrado. Sai com 0 em caso de sucesso, com 2 se o servidor não estiver em execução e com 1 em outras condições de falha. Este modo deve ser usado apenas quando a máquina estiver prestes a ser desligada.

    pg_ctlcluster 9.1 main restart --force
    

    ou

    pg_ctl restart -D datadir -m fast
    

    ou

    pg_ctl restart -D datadir -m immediate
    

    imediatamente seguido por:

    dropdb mydb
    

    Possivelmente em um roteiro para sucessão imediata.

    • 21
  3. Dorian
    2017-02-09T15:02:23+08:002017-02-09T15:02:23+08:00

    Usando a resposta do @filiprem no meu caso e simplificando:

    -- Connecting to the current user localhost's postgres instance
    psql
    
    -- Making sure the database exists
    SELECT * from pg_database where datname = 'my_database_name'
    
    -- Disallow new connections
    UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'my_database_name';
    ALTER DATABASE my_database_name CONNECTION LIMIT 1;
    
    -- Terminate existing connections
    SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'my_database_name';
    
    -- Drop database
    DROP DATABASE my_database_name
    
    • 18
  4. EM0
    2020-10-03T05:30:28+08:002020-10-03T05:30:28+08:00

    Para aqueles que encontram esta pergunta agora, 8 anos depois, o PostgreSQL 13 finalmente adiciona o --forcesinalizador que esta pergunta pede:

    DROP DATABASE database_to_drop WITH (FORCE)

    ou

    dropdb [-f/--force] database_to_drop

    vai

    Tente encerrar todas as conexões existentes com o banco de dados de destino. Ele não termina se transações preparadas, slots de replicação lógica ativa ou assinaturas estiverem presentes no banco de dados de destino.

    Isso falhará se o usuário atual não tiver permissões para encerrar outras conexões. As permissões necessárias são as mesmas do pg_terminate_backend, descritas na Seção 9.27.2. Isso também falhará se não pudermos encerrar as conexões.

    https://www.postgresql.org/docs/13/sql-dropdatabase.html

    • 4
  5. emi
    2021-05-29T04:15:45+08:002021-05-29T04:15:45+08:00

    Usando a resposta de @Dorian , corrigida e aprimorada:

    DB="my_database_name" psql <<EOF
    -- Making sure the database exists
    SELECT * from pg_database where datname = '${DB}';
    
    -- Disallow new connections
    UPDATE pg_database SET datallowconn = false WHERE datname = '${DB}';
    ALTER DATABASE ${DB} CONNECTION LIMIT 1;
    
    -- Terminate existing connections
    SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${DB}';
    
    -- Drop database
    DROP DATABASE ${DB};
    EOF
    
    • 1
  6. Jharwood
    2018-03-30T04:25:46+08:002018-03-30T04:25:46+08:00

    Se você estiver em algo como o RDS, onde as conexões sem um banco de dados selecionado o colocam no banco de dados que você pediu para ser criado por padrão, você pode fazer essa variante para evitar ser a última conexão aberta.

     DROP DATABASE IF EXISTS temporary_db_that_shouldnt_exist; 
    
     CREATE DATABASE temporary_db_that_shouldnt_exist with OWNER your_user; 
    
     \connect temporary_db_that_shouldnt_exist 
     SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'the_db_you_want_removed'; 
    
    
     DROP DATABASE IF EXISTS the_db_you_want_removed; 
     -- 
     -- Name: the_db_you_want_removed; Type: DATABASE; Schema: -; Owner: your_user 
     -- 
    
     CREATE DATABASE savings_champion WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8'; 
    
    
     ALTER DATABASE the_db_you_want_removed OWNER TO your_user; 
    
     \connect the_db_you_want_removed 
    
     DROP DATABASE IF EXISTS temporary_db_that_shouldnt_exist;
    
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve