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

Автор 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