BD Drupal

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
uaparac's picture

Boa tarde alguém me pode ajudar com umas questões de uma BD Megalómanas :)

Pessoal é o seguinte alguém me pode dizer qual o grau de importância da tabela node_revisions....
A mesma está com 11Gb as tabelas Cache filter e form 15Gb cada e já tinha o pessoal do alojamento atrás de mim com pistola em punho :)

Com a excessão das tabelas cache esta tabela será importante? E o porque de estar tão grande... poso esvaziar?

E por exemplo a watchdog para que serve... posso esvaziar?

Cumprimentos e Obrigado

Comments

Caso não desejes ter a tabela

ricardoamaro's picture

Caso não desejes ter a tabela de node_revisions cheia então poderás desligar as revisões dos nós pois é para lá que vão todas e qualquer alteração aos nós.

Podes no entanto manter as revisões dos nós e usar o módulo https://drupal.org/project/node_revision_bulk_delete para limpar as revisões antigas.

Abraço

Este projecto está em D6 por

uaparac's picture

Este projecto está em D6 por isso esse mósulo não existe.

Contudo, achas que posso apagar aceder à BD e apagar os dados da tabela manualmente.

E as watchdog

Se apagares a tabela poderás

ricardoamaro's picture

Se apagares a tabela "node_revisions" poderás ficar sem nós.
Desliga a revisão de nós ou usa o projecto https://drupal.org/project/revision_deletion (D6)

À tabela "watchdog" por sua vez podes fazer TRUNCATE bem como à accesslog caso não te interessem os registos.
De qualquer maneira podes desligar o módulo "dblog" em favor do "syslog". O último envia os registo em Linux para /var/log/syslog em vez de ir para a BD.

Abraço.

Ps. Se estiveres por Lisboa no Dia 23 vem ao nosso meetup https://groups.drupal.org/node/357433

Em sites que gerem bastante

pauloamgomes's picture

Em sites que gerem bastante informação no watchdog os ganhos de performance são consideráveis, além que se consegue manter mais facilmente histórico.

Após terminares estas

ricardoamaro's picture

Após terminares estas limpezas podes correr o comando:

me@:~# mysqlcheck -ov {nomedaBD} 

http://www.linuxcommand.org/man_pages/mysqlcheck1.html
Isto vai fazer OPTIMIZAR as tabelas e reduzir o seu tamanho.

é possível mas..

pauloamgomes's picture

Sim, é possível eliminar as revisões, desde que se tenha o cuidado de se manter a ultima versão do node.

A tabela node_revisions tem uma relação de n-1 com a tabela node através do campo vid, teoricamente terá que se eliminar todos os registos em node_revisions que não tenham equivalência em node.

Vê os seguintes posts:

http://drupal.stackexchange.com/questions/40210/how-to-delete-node-revis...
http://fivepaths.com/drupal-revision-removal-and-database-cleanup-by-bru...

No entanto existem algumas considerações a ter em conta que estão associadas à estrutura de content types que tenhas, pois podes ter outras tabelas que referenciem estas revisões e ao remover-se diretamente na bd terás informação perdida.
E isto leva-nos ao hook content_delete_revision() que é invocado sempre que uma revisão é eliminada e é responsável pela limpeza das restantes relações.
Podes chamar diretamente o hook através de node_invoke_nodeapi($node, 'delete revision') tal como explicado neste post, pode ser um processo moroso se usares isto em brute force, pelo que aconselho a colocares num script drush e programares para executar como batch em horario com menos trafego (tipo de madrugada), tipo:

$query = db_query('SELECT nr.nid, nr.vid FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n) LIMIT 5000');
while ($revision = db_fetch_object($query)) {
  if ($node = node_load($revision->nid, $revision->vid)) {
    node_invoke_nodeapi($node, 'delete revision');
    db_query('DELETE FROM {node_revisions} nr WHERE nr.vid = %d AND nr.vid NOT IN (SELECT n.vid FROM {node} n)', $node->nid);
  }
}

Obviamente não faças nenhuma operação sem testares primeiro num ambiente local ou de testes.

Fiz uma operação destas também em D6 e num content type com cerca de 500.000 registos sem qualquer problema.

Ricardo Amaro, sou do Porto

uaparac's picture

Ricardo Amaro, sou do Porto por isso.. mas obrigado pelo convite na participação do Drupal Café.
Por vezes também fazemos uma aqui pelo Porto com a Claudia e outro pessoal.

Qt à questão da minha BD e site o problema é que a empresa de alojamento já me colocou o site em OFF e não o repõe até estar resolvido estas situações pelo que a única coisa que tenho acesso é à BD atraves do PhpMyadmin, parece que vou ter de partir alguma pedra com comandos SQL.

Obrigado aos 2.

Cumprimentos

Primeiro cria uma copia do

Jamesap's picture

Primeiro cria uma copia do base de dados localmente.
Depois localmente fazes uma query do genero

delete from node_revision where vid NOT IN (SELECT vid FROM node) e ves se functiona.

Assim so apagas as revisoes passadas e nao as que estao actualmente a ser utilizadas.

Cumprimentos

Sim. Obrigado foi mesmo isso

uaparac's picture

Sim. Obrigado foi mesmo isso que fiz mesmo para as restantes tabelas que estavam a consumir mais espaço do que aquilo que deviam :)

Abraço e Obrigado

Não me parece uma boa

pauloamgomes's picture

Não me parece uma boa abordagem, conforme referi a estrutura de dados do Drupal é complexa e pode haver relações que não estás a verificar manualmente, pelo que se deve seguir as boas práticas e recorrer aos mecanismos internos para remoção de conteúdos.

O exemplo anterior pode ser reformulado para uma forma mais massiva e executado diretamente via command line:

<?php
include_once './includes/bootstrap.inc';
include_once './includes/common.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$results = db_query("SELECT nr.nid, nr.vid FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)");

while ($revision = db_fetch_object($results)) {
  if ($node = node_load($revision->nid, $revision->vid)) {
    node_invoke_nodeapi($node, 'delete revision');
    print $revision->nid . " : " . $revision->vid . " removed\n";
  }
}

db_query('DELETE FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');

Podes montar um ambiente local identico ao de producao (precisas de um dump da bd) e executar o codigo

Boas, Haveria problema no

Jamesap's picture

Boas,
Haveria problema no caso de ele apagar as revisoes dos campos e nao do no. Neste caso, se a revisao do no nao existe, as revisoes dos campos nunca serao chamadas.
Nao remove todo o conteudo de revisoes mas tambem nao tera problemas.
De facto a solucao que tu apresentaste é melhor, mas tendo apenas a base de dados, querendo remover espaco, e nao querendo executar php é uma solucao.

Cumprimentos

Mas ficas sempre com dados no

pauloamgomes's picture

Mas ficas sempre com dados no limbo, daí não ser uma abordagem correta e podes estar a causar problemas indeterminados no futuro em potenciais migrações.
As únicas tabelas que normalmente se pode limpar com segurança são as referentes ao watchdog, accesslogs e caches.

Pelos vistos existe um modulo para D6 que faz um pouco do que se pretende (https://drupal.org/project/revision_deletion) mas com base na antiguidade da revisão e de forma automática, desta forma limitas um pouco a possibilidade de voltar a ocorrer algo semelhante.

Para libertar espaço e caso se trate de um engine innoDB (que cresce sempre independentemente da remoção de dados) poderia fazer um dump, drop da bd (confirmando que se refletia no filesystem, podendo ser necessário remover alguns ficheiros remanescentes) e depois carregar o dump.

Portugal

Group categories

Classificação

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week