Отслеживание изменений в базе данных

Автор Idrassil, 26 февраля 2012, 14:56:05

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Idrassil

В данное время разбираюсь со структурой SMF. Часто интересуют вопросы, вида - что меняется в базе данных про добавление бана/удалении чего-то, и т.д. Чтобы не сравнивать все это вручную, написал простой скрипт. Скрипт довольно таки примитивный. Например, надо посмотреть, какие таблицы меняются при добавление бана. Сохраняем текущий дамп бд в файл, добавляем бан, после чего выбираем "сравнить дампы". И скрипт покажет что-то вида:

Различия в таблицах:
старый дамп:
smf_ban_groups: 2
новый дамп:
smf_ban_groups: 3
и т.д.

Соответственно, поменялись данные в этой таблице, тогда уже через phpmyadmin можно смотреть, что именно поменялось и добавилось.

У меня нет особого опыта в php, поэтому вполне вероятно, что код весьма кривой. Если что-то можно было сделать получше/есть уже готовые инструменты - напишите в этой теме. Любая критика приветствуется. Например, вероятно можно брать данные доступа к бд из файла settings.php, а не задавать вручную, и так далее

<form>
<input type="submit" name="wrt" value="записать дамп в файл"/>
<input type="submit" name="cmp" value="сравнить старый и новый дамп"/>
</form>
<?php
//скрипт сравнивает базу данных старую и новую, что поменялось. старый дамп берет с фаела

if (isset($_GET['cmp']))
{
$dump_tab getDump();
cmp_dump($dump_tab);
}
if (isset(
$_GET['wrt']))
{
$dump_tab getDump();
wrt_dump($dump_tab);
}

function 
cmp_dump(&$newarr)
{
//сравнение старого дампа (файл oldump.txt) и нового (текущее состояние бд)
$oldarr unserialize(file_get_contents("oldump.txt"));
//можно добавить проверку, если файла нет, тогда предложить сначала создать..
echo "Различия в таблицах:<br>";
foreach (
$oldarr as $table=>$rows//будут пары вида `smf_log_online => 2`
 
{
if (
strcmp($rows,$newarr[$table])!=0)
{
echo "<b>старый дамп</b> - $table значение $rows<br>";
echo "<b>новый дамп</b> - $table значение $newarr[$table]<br>";

 }
}

function 
wrt_dump($dump_tab)
{
//сохраняе дамп в файл
$dmp serialize($dump_tab);
file_put_contents("oldump.txt",$dmp);
echo 
"Дамп записан в файл";
}

function 
getDump()
{
//получает дамп с базы данных
define ("DB_HOST","localhost");
define ("DB_USER","smftest2");
define ("DB_PASS","111222");
define ("DB_NAME","smftest2");

$res1 mysql_connect(DB_HOST,DB_USER,DB_PASS);
mysql_select_db(DB_NAME,$res1) or die ("не могу соединится с базой данных".mysql_error());

@
$all_tabs mysql_list_tables(DB_NAME) or die("не могу получить таблицы".mysql_error());
$c_tabs mysql_num_rows($all_tabs);
echo 
"всего таблиц - <b>$c_tabs</b> <br>";

$dump_tab = Array(); //массив для дампа

for ($i=0;$i<$c_tabs;$i++)
{
$tab mysql_tablename($all_tabs,$i);
$all_rec mysql_query("SELECT * FROM $tab");
$c_rec mysql_num_rows($all_rec);
$dump_tab[$tab]=$c_rec;
}
mysql_close($res1);

return 
$dump_tab;
}

?>

maestrosite.ru

Если именно изменений, то я бы на вашем месте в функцию smf_db_query добавил логирование запросов, изменяющих базу INSERT/UPDATE/ALTER/и тд. Лог можно и в файл будет писать и в базу.  Тогда будете видеть что-где-когда изменял. Выполнять логирование конкретного запроса (например, по GET-параметру)
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

Idrassil

transkontrol, вы имеете ввиду менять именно "системную" функцию самого SMF, чтобы она писала в файл sql_запрос + гет-параметр, который его вызвал? В принципе да, так будет более подробно, спасибо за идею.

maestrosite.ru

Цитата: Idrassil от 28 февраля 2012, 16:10:08
transkontrol, вы имеете ввиду менять именно "системную" функцию самого SMF, чтобы она писала в файл sql_запрос + гет-параметр, который его вызвал? В принципе да, так будет более подробно, спасибо за идею.

Да, примерно так. Сам SQL-запрос + HTTP-запрос (например, массив $_REQUEST)
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru