VersionX переполнил базу данных
Друзья привет.
столкнулся с болью обнаружил что на обном из сайтов БД выросла но неимоверных размеров!
После недолгого копания выяснилось что VersionX хранит в БД все что произошло за год в размере 3,4 гигов.
И это печаль.
Итак вопрос как говорится к старшим товарищам что с этим можно безопасно сделать?
Мои варианты:
столкнулся с болью обнаружил что на обном из сайтов БД выросла но неимоверных размеров!
После недолгого копания выяснилось что VersionX хранит в БД все что произошло за год в размере 3,4 гигов.
И это печаль.
Итак вопрос как говорится к старшим товарищам что с этим можно безопасно сделать?
Мои варианты:
- Очистить эту таблицу в БД — тут я не великий специалист боюсь угробить сайт...
- Понять как работает дополнение и встроить настройку чтоб сохранялось только 3 последних версий — я тут совсем не специалист.
- Написать автору дополнения и просить помощи
Комментарии: 6
Сниппет для удаления старых версий:
Вызывать так:
<?php
/**
* versionCleanX
*
* @author Scott Pronych, September 27, 2013
*
* DESCRIPTION
*
* For use with VersionX to delete old content
*
* PROPERTIES:
*
* &contentType - can be resource, chunk, plugin, snippet, template, or templatevar
* &maxVersions - integer value for max number of versions you would like to keep
*
* USAGE:
*
* [[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
*
*/
$cx_type = $modx->getOption('contentType', $scriptProperties, 'resource');
$cx_max = (int) $modx->getOption('maxVersions', $scriptProperties, 5);
$GLOBALS['count'] = 1;
$GLOBALS['total'] = 0;
$GLOBALS['deleted'] = 0;
$GLOBALS['page_total'] = 0;
$GLOBALS['page_deleted'] = 0;
$GLOBALS['page_name'] = '';
$GLOBALS['prev_content_id'] = 0;
$GLOBALS['prev_version_id'] = 0;
switch ($cx_type) {
case 'chunk':
$name = 'name';
break;
case 'plugin':
$name = 'name';
break;
case 'snippet':
$name = 'name';
break;
case 'template':
$name = 'templatename';
break;
case 'templatevar':
$name = 'name';
break;
default:
$name = 'title';
$cx_type = 'resource';
}
$GLOBALS['db_name'] = 'modx_versionx_' . $cx_type;
function delete_row ($id) {
global $modx;
$query = "DELETE FROM `" . $GLOBALS['db_name'] . "` WHERE version_id = '" . $id . "'";
$result = $modx->query($query);
if (!is_object($result)) return false;
else {
$GLOBALS['deleted']++;
$GLOBALS['page_deleted']++;
$GLOBALS['page_total']++;
$GLOBALS['total']++;
$GLOBALS['count']++;
return true;
}
}
function log_row () {
$GLOBALS['data'] .= '<tr><td>' . $GLOBALS['page_name'] . '</td><td>' . $GLOBALS['page_total'] . '</td><td>' . $GLOBALS['page_deleted'] . "</td></tr>\n";
$GLOBALS['page_deleted'] = 0;
$GLOBALS['page_total'] = 1;
$GLOBALS['count'] = 1;
}
$query = "SELECT version_id, content_id, " . $name . " AS page_title FROM `" . $GLOBALS['db_name'] . "` ORDER BY content_id ASC, version_id DESC";
$GLOBALS['data'] = '';
$output = 'An error occurred: ';
$versionx = $modx->query($query);
if (!is_object($versionx)) {
return $output . 'query error ' . print_r($modx->errorInfo(), true);
}
else {
while($row = $versionx->fetch(PDO::FETCH_ASSOC)) {
// New content_id so reset
if ($prev_content_id == 0) {
$prev_content_id = $row['content_id'];
$prev_version_id = $row['version_id'];
$GLOBALS['total']++;
$GLOBALS['page_total']++;
$GLOBALS['count']++;
$GLOBALS['page_name'] = $row['page_title'];
}
elseif ($prev_content_id != $row['content_id']) {
if ($GLOBALS['count'] > $cx_max) {
if (!delete_row($prev_version_id)) return $output . 'deleting row for ' . $GLOBALS['page_name'] . ' Row: ' . $prev_content_id . ' ' . print_r($modx->errorInfo(), true);
$GLOBALS['page_total']--;
}
else {
$GLOBALS['total']++;
$GLOBALS['count']++;
}
log_row();
$prev_content_id = $row['content_id'];
$prev_version_id = $row['version_id'];
$GLOBALS['page_name'] = $row['page_title'];
}
// Content count is over the max so delete previous row
elseif ($GLOBALS['count'] > $cx_max) {
delete_row($prev_version_id);
$prev_content_id = $row['content_id'];
$prev_version_id = $row['version_id'];
}
else {
$GLOBALS['count']++;
$GLOBALS['page_total']++;
$GLOBALS['total']++;
$prev_content_id = $row['content_id'];
$prev_version_id = $row['version_id'];
}
}
log_row();
if ($GLOBALS['data'] != '') {
$output = '<h3>VersionX Cleanup for ' . $GLOBALS['db_name'] . '</h3>
<p>Total records: <strong>' . $GLOBALS['total'] . '</strong>
Total deleted: <strong>' . $GLOBALS['deleted'] . '</strong></p>
<table class="table table-striped">
<thead>
<tr>
<th>Page name</th>
<th>Total found</th>
<th>Deleted</th>
</tr>
</thead>
<tbody>
' . $GLOBALS['data'] . '</tbody></table>
';
}
else $output = 'Error: no data found.';
}
$query = "OPTIMIZE TABLE `" . $GLOBALS['db_name'] . "`";
$versionx = $modx->query($query);
if (!is_object($versionx)) {
$output = 'Optimize error ' . print_r($modx->errorInfo(), true) . $output;
}
return $output;
Вызывать так:
[[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
Ух нечего себе!
Вот спасибо мега полезно, однозначно в избранное.
Вот спасибо мега полезно, однозначно в избранное.
An error occurred: query error Array ( [0] => 42S02 [1] => 1146 [2] => Table 's86.modx_versionx_resource' doesn't exist )
Сие нам говорит что таблицы нет, но она есть! Так как префикс modx_ у БД на модхосте меняется, то надо либо его заменить ручками, либо прописать динамическое определение префикса.
Если кто подскажет как сделать динамику будет огонь!
Я нашел на 55 строке
Сие нам говорит что таблицы нет, но она есть! Так как префикс modx_ у БД на модхосте меняется, то надо либо его заменить ручками, либо прописать динамическое определение префикса.
Если кто подскажет как сделать динамику будет огонь!
Я нашел на 55 строке
$GLOBALS['db_name'] = 'сюда дописал префикс_versionx_' . $cx_type;
$GLOBALS['db_name'] = $modx->getOption('table_prefix') . 'versionx_' . $cx_type;
Если записей слишком много и сервер не может обработать запрос то добавьте это. У меня уже под 200к версий и выпадало в ошибку
<?php ini_set('memory_limit', '256M');
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.