DB2 Logfile Limitation, SQLCODE: -964
J'ai essayé un énorme requête d'insertion dans la base de données DB2.
INSÉREZ DANS MY_TABLE_COPY ( SELECT * FROM MA_TABLE);
Avant cela, j'ai mis les points suivants:
UPDATE DATABASE CONFIGURATION FOR MY_DB USING LOGFILSIZ 70000;
UPDATE DATABASE CONFIGURATION FOR MY_DB USING LOGPRIMARY 50;
UPDATE DATABASE CONFIGURATION FOR MY_DB USING LOGSECOND 2;
db2stop force;
db2start;
et j'ai eu cette erreur:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0964C The transaction log for the database is full. SQLSTATE=57011
SQL0964C The transaction log for the database is full.
Explanation:
All space in the transaction log is being used.
If a circular log with secondary log files is being used, an
attempt has been made to allocate and use them. When the file
system has no more space, secondary logs cannot be used.
If an archive log is used, then the file system has not provided
space to contain a new log file.
The statement cannot be processed.
User Response:
Execute a COMMIT or ROLLBACK on receipt of this message (SQLCODE)
or retry the operation.
If the database is being updated by concurrent applications,
retry the operation. Log space may be freed up when another
application finishes a transaction.
Issue more frequent commit operations. If your transactions are
not committed, log space may be freed up when the transactions
are committed. When designing an application, consider when to
commit the update transactions to prevent a log full condition.
If deadlocks are occurring, check for them more frequently.
This can be done by decreasing the database configuration
parameter DLCHKTIME. This will cause deadlocks to be detected
and resolved sooner (by ROLLBACK) which will then free log
space.
If the condition occurs often, increase the database
configuration parameter to allow a larger log file. A larger log
file requires more space but reduces the need for applications to
retry the operation.
If installing the sample database, drop it and install the
sample database again.
sqlcode : -964
sqlstate : 57011
des suggestions?
Pourquoi n'utilisez-vous pas DB/2 programmes utilitaires pour DÉCHARGER/CHARGER votre table? Les services publics ne utilisez pas le journal de la même façon qu'un simple INSERTION de tresorerie. DÉCHARGEMENT/CHARGEMENT sont un ensemble beaucoup plus efficace pour ce genre de chose. Rappelez-vous que vous ne pouvez pas problème s'ENGAGE dans le milieu de l'INSERT/SELECT operation - il a tout à se produire comme une seule unité de travail et pour des tables de grande taille cela peut surtaxer le journal.
OriginalL'auteur Afshin Moazami | 2012-11-26
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé les valeurs maximales pour le LOGFILSIZ, LOGPRIMARY, et LOGSECOND;
La valeur maximale pour LOGFILSIZ peut être différent pour windows, linux, etc. Mais, vous pouvez essayer un très grand nombre et la base de données vous permettent de savoir ce qui est le max. Dans mon cas, c'était 262144.
Aussi, LOGPRIMARY + LOGSECOND <= 256. J'ai essayé de 128 pour chaque, et il fonctionne pour mon énorme requête.
OriginalL'auteur Afshin Moazami
Au lieu d'effectuer des essais et des erreurs avec le DB CFG paramètres, vous pouvez placer ces instructions INSERT dans la Procédure Stockée à l'intervalle de validation.
Consulter le post suivant pour les détails: Ce qui pourrait aider.
https://prasadspande.wordpress.com/2014/06/06/plsql-ways-updatingdeleting-the-bulk-data-from-the-table/
Grâce
OriginalL'auteur Prasad Pande