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 / 186045
Accepted
guettli
guettli
Asked: 2017-09-16 02:54:47 +0800 CST2017-09-16 02:54:47 +0800 CST 2017-09-16 02:54:47 +0800 CST

Como evito alterações no meu banco de dados PostgreSQL?

  • 772

Meus passos:

  1. executar o final pg_dumpallem um servidorprod-server-old
  2. Desligar prod-server-oldpara sempre.
  3. copie a saída para um servidor diferente ( prod-server-new)
  4. Restaure o db lá.
  5. Todo o tráfego vai para prod-server-newagora

Como posso evitar modificações no banco de dados durante pg_dumpall(entre a etapa 1 e a etapa 2), para que as modificações durante esse período não possam ser perdidas?

No meu caso, é 100% OK ter um pequeno tempo de inatividade.

Existem vários bancos de dados no "cluster" (aliás, eu não gosto da palavra "cluster". Acho que a maioria das pessoas pensa que um "cluster" é um grupo de vários computadores, mas neste caso significa um servidor Postgres, que contém vários bancos de dados).

Minha pergunta foi marcada como possível duplicada para "Tornar o banco de dados Postgres temporariamente somente leitura (para executar instantâneos de volume)". Não acho que seja uma duplicata, pois no meu caso é diferente, pois não peço um estado temporário somente leitura.

postgresql migration
  • 4 4 respostas
  • 3944 Views

4 respostas

  • Voted
  1. anto418
    2017-09-16T04:31:05+08:002017-09-16T04:31:05+08:00

    Duas maneiras de fazer isso:

    • Se você não se importa com o tempo de inatividade (maneira fácil):

    revogar o connectprivilégio para o publicgrupo. Isso impedirá que todos, exceto os superusuários, se conectem. Em seguida, reinicie o servidor ou encerre todas as conexões e prossiga com o backup usando uma conta de superusuário.

    REVOKE CONNECT TO DATABASE (database) FROM public
    
    • Se você se importa com o tempo de inatividade:

    Coloque seu banco de dados em modo somente leitura:

    ALTER DATABASE (database) SET default_transaction_read_only = true;
    

    Prossiga com pg_dumpall. Sem necessidade de reinicialização e sem tempo de inatividade.

    Claro, você deve repetir isso em todos os bancos de dados que deseja "bloquear". Se você tiver um número significativo de bancos de dados, você pode tornar todo o cluster somente leitura: defina default_transaction_read_only = on;em seu postgresql.conf e recarregue o serviço postgres.

    Observe que não testei nenhum desses comandos, prossiga por sua conta e risco.

    • 4
  2. Best Answer
    guettli
    2017-09-16T03:37:00+08:002017-09-16T03:37:00+08:00

    Uma solução alternativa:

    Altere a porta do PostgreSQL em prod-server-old. Dessa forma, é improvável que os clientes se conectem ao banco de dados durante o pg_dumpall --port=OTHER_PORT.

    • 3
  3. SEarle1986
    2017-09-16T03:15:08+08:002017-09-16T03:15:08+08:00

    Eu sou um administrador do SQL Server (não do Postgres), então não tenho 100% de certeza, mas se o tempo de inatividade não for um problema, você pode:

    • matar todas as conexões
    • impedir logons remotos
    • faça logon no servidor db e faça login no db como superusuário
    • faça o pg_dumpall
    • reativar logons remotos

    ?

    • 2
  4. Abelisto
    2017-09-17T04:43:32+08:002017-09-17T04:43:32+08:00

    Usando acionadores:

    create function __fn_db_readonly() returns event_trigger language plpgsql as $$
    begin
      raise exception '%', 'Database is in read-only mode';
    end $$;
    
    create function _fn_db_readonly() returns trigger language plpgsql as $$
    begin
      raise exception '%', TG_ARGV[0];
    end $$;
    
    create function set_db_readonly(amessage text) returns void language plpgsql as $$
    declare
      t record;
      tbl_name text;
      stm text;
    begin
      if coalesce(amessage, '') = '' then
        -- Database
        drop event trigger __tg_ro_database1;
        drop event trigger __tg_ro_database2;
        drop event trigger __tg_ro_database3;
        -- Data
        for t in (select * from pg_tables where not schemaname in ('pg_catalog', 'information_schema')) loop
          tbl_name := format('%I.%I', t.schemaname, t.tablename);
          stm := 'drop trigger if exists _tg_ro on ' || tbl_name;
          execute stm;
        end loop;
      else
        -- Data
        for t in (select * from pg_tables where not schemaname in ('pg_catalog', 'information_schema')) loop
          tbl_name := format('%I.%I', t.schemaname, t.tablename);
          stm := format('create trigger _tg_ro before insert or update or delete on %s execute procedure _fn_db_readonly(%L)', tbl_name, amessage);
          execute stm;
        end loop;
        -- Database
        create event trigger __tg_ro_database1 on ddl_command_start execute procedure __fn_db_readonly();
        create event trigger __tg_ro_database2 on table_rewrite execute procedure __fn_db_readonly();
        create event trigger __tg_ro_database3 on sql_drop execute procedure __fn_db_readonly();
      end if;
      return;
    end $$;
    

    Em seguida, para tornar o banco de dados somente leitura:

    select set_db_readonly('Database is in read-only mode due to maintance.');
    

    e para torná-lo editável novamente:

    select set_db_readonly('');
    
    • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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