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 / 262775
Accepted
Lennart - Slava Ukraini
Lennart - Slava Ukraini
Asked: 2020-03-28 02:03:11 +0800 CST2020-03-28 02:03:11 +0800 CST 2020-03-28 02:03:11 +0800 CST

Novo bufferpool não está sendo usado

  • 772

Como parte de uma migração, criei um novo bufferpool - digamos BP8K - tamanho 8K e um tablespace usando esse bp e uma tabela nesse tablespace, que é carregada com dados. No entanto, recebo um:

 SQL1218N There are no pages currently available in bufferpool "4097"

durante esse processo. Olhando para db2topele, parece que o bufferpool padrão IBMSYSTEMBP8K é usado em vez de BP8K, o que explica o fenômeno.

Eu vi semelhante quando não há memória compartilhada suficiente para iniciar o bufferpool, mas neste caso BP8K aparece em ambos db2top, e db2pd -d ... -bufferpools. Também é possível alterar o tamanho do bp que, no caso de memória insuficiente, geralmente resulta em um aviso de que o bufferpool não foi iniciado.

A db2stop; db2startcorrige o problema, mas isso deveria ser realmente necessário? A migração é um script sql que é executado a partir de uma estrutura de atualização, então prefiro não adicionar algum gancho que force todos os aplicativos. Pensamentos?

db2level
DB21085I  This instance or install (instance name, where applicable: 
"db2inst1") uses "64" bits and DB2 code release "SQL11050" with level 
identifier "0601010F".
Informational tokens are "DB2 v11.5.0.0", "s1906101300", "DYN1906101300AMD64", 
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5".

db2licm -l
Product name:                     "DB2 Enterprise Server Edition"
License type:                     "Restricted"
Expiry date:                      "Permanent"
Product identifier:               "db2ese"
Version information:              "11.5"
Max amount of memory (GB):        "128"
Max number of cores:              "16"

cat /proc/meminfo 
MemTotal:       164759044 kB
MemFree:         4267032 kB
MemAvailable:   131089520 kB

Mark Barinstein me ajudou a determinar que o bufferpool não foi iniciado afinal:

ADM6073W  The table space "TBSPC8K" (ID "9") is configured to use 
          buffer pool ID "3", but this buffer pool is not active at this time. 
          In the interim the table space will use buffer pool ID "4097".

A maior parte da memória está configurada para AUTOMATICincluir o novo BP, então não sei por que não pode iniciá-lo. Há muita memória disponível no servidor, e o db está usando ~ 1,8 Gb (principalmente bufferpool), então não sei por que o Db2 não pode iniciar o novo bufferpool. Tentei adicionar um commit após a criação do bp, tbspace mas isso não ajudou.

A pergunta agora se torna: Por que o Db2 não pode iniciar este BP. De acordo com os documentos :

Se houver memória suficiente disponível, o conjunto de buffers poderá se tornar ativo imediatamente. Por padrão, novos conjuntos de buffers são criados usando a palavra-chave IMMEDIATE e, na maioria das plataformas, o gerenciador de banco de dados pode adquirir mais memória.

Parece haver muita memória disponível no servidor. O banco de dados alocou aproximadamente 1,8 Gb de memória antes de criar novos tablespaces. As instruções para a criação de bp se parecem com:

CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K @
CREATE BUFFERPOOL BP16K SIZE AUTOMATIC PAGESIZE 16K @
CREATE BUFFERPOOL BP32K SIZE AUTOMATIC PAGESIZE 32K @
CREATE LARGE TABLESPACE TBSPC8K PAGESIZE 8K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP8K @
CREATE LARGE TABLESPACE TBSPC16K PAGESIZE 16K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP16K @
CREATE LARGE TABLESPACE TBSPC32K PAGESIZE 32K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP32K @

Eu parei o script após a criação do bp, tbspace, forcei todos os aplicativos, depois executei o resto e funcionou bem. Não tenho essa impressão dos documentos, mas talvez isso tenha que ser feito.

Atualizei db cfg memory configde acordo com:

db2 update db cfg for <db> using SELF_TUNING_MEM ON
db2 update db cfg for <db> using DATABASE_MEMORY AUTOMATIC
db2 update db cfg for <db> using SORTHEAP AUTOMATIC
db2 update db cfg for <db> using SHEAPTHRES_SHR AUTOMATIC
db2 connect reset
db2 connect to <db>

e verifiquei que SEL_TUNING_MEMORYestava ativo:

db2 get db cfg for <db> show detail | grep SELF

mas continuo com o mesmo problema.

Depois de restaurar o banco de dados (ou seja, todas as configurações de memória), fiz um pequeno teste:

~]$ cat test.sh 
#!/bin/sh

OPTS=`getopt -o d:u:p: -- "$@"`
eval set -- "$OPTS"

user=""
passwd=""
while true ; do
    case "$1" in
        -d) db="$2"; shift 2;;
        -u) user="$2"; shift 2;;
        -p) passwd="$2"; shift 2;;
        --) shift; break;;
    esac
done

db2 connect to $db user $user using $passwd
if [ $? -ne 0 ]; then
    exit 1
fi

db2diag -A

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K';
END
@"

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'CREATE LARGE TABLESPACE TBSPC8K PAGESIZE 8K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP8K';
END
"

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'COMMIT';
END
"

db2diag -A

Então fiz este teste:

db2diag: Moving "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log"
         to     "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57"

DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.
db2diag: Moving "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log"
         to     "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57"

então todas as 3 instruções sql foram bem-sucedidas, mas no diaglog eu encontro:

2020-03-28-12.20.57.162214+060 I1800E409             LEVEL: Event
PID     : 5301                 TID : 140165787223936 PROC : db2diag
INSTANCE: db2inst1             NODE : 000
HOSTNAME: gollum
FUNCTION: DB2 UDB, RAS/PD component, pdDiagArchiveDiagnosticLog, probe:88
CREATE  : DB2DIAG.LOG ARCHIVE : /opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57 : success
IMPACT  : Potential

2020-03-28-12.20.57.228408+060 E2210E868             LEVEL: Warning
PID     : 17468                TID : 140189351536384 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : STUDERA
APPHDL  : 0-637                APPID: *LOCAL.db2inst1.200328112127
UOWID   : 1                    ACTID: 4
AUTHID  : DB2INST1             HOSTNAME: gollum
EDUID   : 2442                 EDUNAME: db2agent (STUDERA) 0
FUNCTION: DB2 UDB, buffer pool services, sqlbAssignBufferPool, probe:2
MESSAGE : ADM6073W  The table space "TBSPC8K" (ID "9") is configured to use 
          buffer pool ID "3", but this buffer pool is not active at this time. 
          In the interim the table space will use buffer pool ID "4097".  The 
          inactive buffer pool should become available at next database startup 
          provided that the required memory is available.

2020-03-28-12.20.57.272773+060 I3079E557             LEVEL: Info
PID     : 17468                TID : 140189351536384 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : STUDERA
APPHDL  : 0-637                APPID: *LOCAL.db2inst1.200328112127
UOWID   : 1                    ACTID: 5
AUTHID  : DB2INST1             HOSTNAME: gollum
EDUID   : 2442                 EDUNAME: db2agent (STUDERA) 0
FUNCTION: DB2 UDB, buffer pool services, sqlbCreateBufferPoolAct, probe:98
MESSAGE : Creating bufferpool "BP8K" Size: "1000"  <automatic>

Resumindo, não tenho a menor idéia de como detectar se o bufferpool foi iniciado ou não.

Confirmar cada instrução em test.sh(e também no meu script original) é bem-sucedido e não há entrada no diaglog. Apesar disso parecer resolver o problema, também adicionei um atraso após a criação de bufferpools:

CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K @

-- delay commit
BEGIN
    DECLARE now TIMESTAMP;
    DECLARE end TIMESTAMP;
    SET now = TIMESTAMP(GENERATE_UNIQUE());
    SET end = now + 5 seconds;
    WHILE (now < end) DO
        SET now = TIMESTAMP(GENERATE_UNIQUE());
    END WHILE;
END @

Esta é minha máquina de laboratório e não há praticamente nenhuma outra atividade nela.

db2 db2-luw
  • 2 2 respostas
  • 752 Views

2 respostas

  • Voted
  1. Best Answer
    mustaccio
    2020-03-28T05:57:38+08:002020-03-28T05:57:38+08:00

    db2stop/ db2startnão é necessário para tornar utilizável um bufferpool recém-criado, mas na maioria dos casos você deve desativar e reativar o banco de dados para que os tablespaces possam usar o novo bufferpool.

    Isso porque, mesmo que a IMMEDIATEopção seja especificada ou assumida implicitamente

    Se não houver espaço reservado suficiente na memória compartilhada do banco de dados para alocar o novo conjunto de buffers (SQLSTATE 01657), a instrução será executada como DEFERRED.

    Dependendo dos vários parâmetros de configuração de memória em vigor, principalmente database_memory, pode não haver memória suficiente reservada pelo gerenciador de banco de dados para alocar imediatamente o novo bufferpool.

    Também pode haver um problema de tempo, que é evidente no fragmento de log de diagnóstico adicionado à pergunta posteriormente, onde é possível ver que a criação do espaço de tabela ocorre (com um aviso) antes que o bufferpool para ele seja alocado com êxito. Demora algum tempo para que a nova memória compartilhada para o BP seja alocada - o gerenciador de banco de dados faz um "caminhada de memória", visitando todas as páginas para ter certeza de que foi confirmada pelo sistema operacional. A introdução de uma pausa entre create bufferpoole create tablespacepode resolver o problema.

    • 4
  2. Mark Barinstein
    2020-03-28T05:52:25+08:002020-03-28T05:52:25+08:00

    Você deve manipular a mensagem possível SQLCODE = 20189( ) após . A mensagem correspondente tem a seguinte aparência:SQLSTATE = '01657'CREATE BUFFERPOOL

    db2 "create bufferpool BP8K SIZE XXXXXX"
    
    SQL20189W  The buffer pool operation (CREATE/ALTER) will not take effect until
    the next database startup due to insufficient memory.  SQLSTATE=01657
    

    A mensagem db2diag.log correspondente:

    2020-03-27-17.35.31.377000+180 E6844329F842         LEVEL: Warning
    PID     : 7260                 TID : 1612           PROC : db2syscs.exe
    INSTANCE: DB2                  NODE : 000           DB   : SAMPLE
    APPHDL  : 0-146                APPID: *LOCAL.DB2.200317091324
    UOWID   : 12                   ACTID: 1
    AUTHID  : DB2ADMIN             HOSTNAME: xxx
    EDUID   : 1612                 EDUNAME: db2agent (SAMPLE)
    FUNCTION: DB2 UDB, buffer pool services, sqlbCreateBufferPool, probe:5655
    MESSAGE : ADM6053W  The CREATE BUFFERPOOL statement for buffer pool "BP8K" (ID
              "3") could not be performed immediately because not enough free
              memory existed in the database shared memory.  The bufferpool will be
              created on the next database restart.  Refer to the documentation for
              SQLCODE 20189.
    

    Posso sugerir o seguinte comando para isso, que gera uma exceção sql, se o bufferpool não puder ser alocado no momento da criação.

    --#SET TERMINATOR @
    BEGIN
      DECLARE EXIT HANDLER FOR SQLSTATE '01657'
        SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';
    
      -- EXECUTE IMMEDIATE 'CREATE BUFFERPOOL BP8K SIZE XXXXXX';
      -- Just for test:
      ---CALL SYSIBMINTERNAL.SQLEML_RAISE_ERROR(20189, NULL, NULL);
    END
    @
    
    • 2

relate perguntas

  • Migração de DB2 para MySQL

  • O que significa TBSCAN GENROW no Plano Explicativo?

  • Emule o comportamento do REGEXP no DB2 SQL

  • BLOB no DB2 v9 no z/OS

  • O que significa HSJOIN em um plano de explicação?

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