Drupal.ru - пропали ноды и комментарии!?

Аватар пользователя Geldora Geldora 19 июля 2009 в 14:07

Привет!

Эмм, у меня ощущение, что с Друпал.ру пропали ноды и комментарии за субботу!

Последнее сообщение от 18 числа - Hierarchical Select и Location - как бы совместить?, Прислано: kirbaranov, сб, 18/07/2009 - 02:53

Следующее - уже от Гора, дата: 19/07/2009 - 08:03

Кроме того, пропали комментарии за субботу. По-меньшей мере мои :)

В принципе, особо важного за субботу ничего не было... Но интересно: что случилось?

UPD from Axel: данные за 18 июля и ночь 19 июля не перенесённые при переводе сайта на другой сервер восстановлены. Изините за это недоразумение, вроде как ничего не потерялось. Восстановлены пользователи, ноды и комментарии.
Если вы регистрировались повторно под тем же именеме 19 июля, то входите под паролем, с которым регистрировались в первый раз!
Материалы созданные 19 июля получили новые NID, CID, а регистрировавшиеся пользователи новые UID. Учтите это если пытаетесь пройти по старым ссылкам!

0 Thanks

Комментарии

Аватар пользователя penexe penexe 19 июля 2009 в 14:20
"admin" wrote:

вс, 19/07/2009 - 08:57: admin
VPS требует перенастроек и пока с ним будем разбираться сайт перенесён на другой сервер. IP: 89.108.94.5. Остальные сайты с VPS также планируется на время перенести сюда.

откат был

Аватар пользователя axel axel 19 июля 2009 в 14:24

Биип. Не обошлось без косяков ( Я залил субботний бэкап, вместо свежего - в последнем всё есть на момент остановки сайта. Да, кстати, сайт работает уже на другом сервере, если кто не заметил. Ну вот, теперь задача как перелить субботний контент, терять как-то неприлично.

Аватар пользователя axel axel 19 июля 2009 в 14:30

Так, пожалуй стопану сайт, пока базы совсем не разошлись, сохраню бэкап, вытащу данные за сегодня, залью бэкап от 19 июля и поверх повставляю сегодняшние ноды, юзеров и комменты (срочно нужно сделать скрипт). Вот только позавтракаю - так что у вас ещё есть время ;) Желающие помочь - я в джаббере axel@drupal.ru.

NIDы b CIDы сегодняшних нодов поменяются! Регистрацию на сайт пока закрываю, чтобы не путались новые юзеры.

Аватар пользователя Geldora Geldora 19 июля 2009 в 14:47

Axel, а потом можете скрипт в паблик выложить? Хотя бы основу, как это делается?

Потому что у многих такие проблемы возникают, я например, руками переносила комментарии в прошлый раз...

Аватар пользователя root root 19 июля 2009 в 16:36
Geldora wrote:

Axel, а потом можете скрипт в паблик выложить? Хотя бы основу, как это делается?

Потому что у многих такие проблемы возникают, я например, руками переносила комментарии в прошлый раз...

Скрипт получился такой. Это непроверенный код, пока не конвертировал Проверено на drupal.ru - версия ниже работает, хотя на некоторые мелочи я забил (на иерархию комментов к примеру). Если кто из программеров на сайте - гляньте плиз, всё ли по виду ок? А я пока пойду пообедаю, после уже займусь деструкцией базы )

UPD. последняя версия получилась такой (есть ли в ней баги узнаем через время, когда народ опять чего-нибудь из своих постов не найдёт ;):

<?php
/**
* file
* Для восстановления контента потерянного после переноса drupal.ru. Скрипт
* работает из корня сайта. Данные коннекта ко второй БД помещаются в конфиг
* (см. использование $db_url как массива).
*
* default - старая БД из бэкапа за 19 июля
* new - новая БД (бэкап за 18 июля + новый контент с работающего сайта)
*
* сайт должен быть в OFFLINE во время работы скрипта
* запускать только из броузера через url резервного сайта!
*
* author Злой Невыспавшийся Аксель
* license GPL v2
*/

include('./includes/bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//ini_set('error_reporting', 'E_ALL');
//ini_set('display_errors', 'On');

global $user;
if (($user->uid) != 1) die("Отвали, тут люди делом заняты");

/*
* Сюда занести таймстампы с которых в новой базе появился новый контент,
* которого не было в старой.
*
* для нодов: select nid, created, from_unixtime(changed) from dru_node order by
* changed desc limit 20;
*
* changed 1247968655 (2009-07-19 05:57:35) nid=31869
*
* для комментов: select cid, timestamp, from_unixtime(timestamp) from
* dru_comments order by timestamp desc limit 50;
*
* timestamp 1247969027 (2009-07-19 06:03:47) cid = 169478
*
* для юзеров:
*
* created 1247981595 (2009-07-19 09:33:15) uid = 41406
*
* таксономию переносить влом - потеряются теги за день и бип с ними, у меня ещё
* полно работы
*/

$new_nid = 31869;
$new_cid = 169478;
$new_uid = 41406;

db_query('truncate {cache}');
db_query('truncate {cache_block}');
db_query('truncate {cache_filter}');
db_query('truncate {cache_form}');
db_query('truncate {cache_google}');
db_query('truncate {cache_menu}');
db_query('truncate {cache_mollom}');
db_query('truncate {cache_page}');
db_query('truncate {cache_reptag}');
db_query('truncate {cache_update}');

/*
* Алгоритм такой:
*
* получаем ID всех новых юзеров из new и для каждого:
*
* загружаем юзера из new
*
* пересохраняем в default
*
* сохраняем маппинг старого и нового uid в usermap
*
* получаем ID всех новых нодов в new и для каждой ноды:
*
* сверяем uid по usermap и меняем если надо
*
* сохраняем ноду в default
*
* сохраняем маппинг старого и нового nid в nodemap
*
* получаем cid новых комментов и для каждого;
*
* сверяем uid по usermap и меняем
*
* сверяем nid по nodemap и меняем
*
*/

print "
=== USERS ===
";
db_set_active('new');
$account_data = db_query('SELECT uid, created, pass, name FROM {users} WHERE uid >= %d', $new_uid);
db_set_active();
while ($account_from_new = db_fetch_object($account_data)) {
db_set_active('new');
$account = user_load(array('uid' => $account_from_new->uid));
db_set_active();
if ($uid = db_result(db_query("SELECT uid FROM {users} WHERE name = '%s'", $account_from_new->name))) {
print "User " . $account_from_new->name . " already registered. Skiped him.
";
$usermap[$account_from_new->uid] = $uid;
continue;
}

$account = user_save(null, array(
'name' => $account->name,
'mail' => $account->mail,
'created' => $account->created,
'picture' => $account->picture,
'country' => $account->country,
'city' => $account->city,
'profile_referer' => $account->profile_referer,
'realname' => $account->realname
));

if ($account) { // юзер мог и не сохраниться, если чел перерегался в вск в новой базе
// приоритет у старого аккаунта
$usermap[$account_from_new->uid] = $account->uid;
db_query("UPDATE {users} SET pass = '%s' WHERE uid = %d", $account_from_new->pass, $account->uid);
print "User map: " . $account_from_new->uid . " -> " . $account->uid . "
";
}
else {
print $account_from_new->uid . " conflicted with default DB!
";
}
}

print "
=== NODES ===
";
db_set_active('new');
$node_data = db_query('SELECT nid, created, changed FROM {node} WHERE nid >= %d', $new_nid);
db_set_active();
while ($node_from_new = db_fetch_object($node_data)) {
db_set_active('new');
$node = node_load($node_from_new->nid);
db_set_active();
if (array_key_exists($node->uid, $usermap)) {
$node->uid = $usermap[$node->uid];
print "Uid mapped
";
}
unset($node->nid);
node_save($node);

if ($node->nid) {
$nodemap[$node_from_new->nid] = $node->nid; // [nid from NEW db] = saved nid from default db
db_query('UPDATE {node} SET created = %d, change d = %d WHERE nid = %d', $node_from_new->created, $node_from_new->changed, $node->nid); // перебиваем даты на прошлое
//db_query('UPDATE {node_revisions} SET timestamp = %d WHERE nid = %d', $node_from_new->changed, $node->nid); // версия ноды после переноса только одна - последняя из new
print "
Node map: " . $node_from_new->nid . " -> " . $node->nid;
}
else {
print "Node " . $node_from_new->nid . " not saved!
";
}
}

print "
=== COMMENTS ===
";
db_set_active('new');
$comment_data = db_query('SELECT cid, timestamp FROM {comments} WHERE cid >= %d', $new_cid);
db_set_active();
while ($comment_from_new = db_fetch_object($comment_data)) {
db_set_active('new');
$comment = _comment_load($comment_from_new->cid);
db_set_active();
if (array_key_exists($comment->uid, $usermap)) {
$comment->uid = $usermap[$comment->uid];
print "Mapped uid
";
}

if (array_key_exists($comment->nid, $nodemap)) {
$comment->nid = $nodemap[$comment->nid];
print "Mapped nid
";
}
unset($comment->cid);
unset($comment->pid); // влом возиться с иерархией, будут просто привязаны к нодам
$cid = comment_save((array)$comment);
db_query('UPDATE {comments} SET timestamp = %d WHERE cid = %d', $comment_from_new->timestamp, $cid);
if ($cid) {
print "Comment map: " . $comment_from_new->cid . " -> " . $cid . "
";
}
else {
print "Comment save error for " . $cid;
}
}

?>