Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Архивация БД
 
 автор: Loki   (16.05.2005 в 00:03)   письмо автору
 
 

Есть проблема: база разрослась до определенного размера и забакапить через phpmyadmin не получается (видимо, скрипт вылетает по таймауту не успев полностью сформировать файл для экспорта), а базу заархивить хочется, так как хостер этого не делает.
Как быть в этом случае? Можно написать скрипт, который бы писал данные в файл (частями, например). Но файл при этом будут совершенно неприличных размеров (если без архивации, а с архивацией я не знаю как сделать).
Как быть? Какие есть варианты? В конце концов, как сделать архивацию?:)

   
 
 автор: cheops   (16.05.2005 в 01:15)   письмо автору
 
   для: Loki   (16.05.2005 в 00:03)
 

В phpMyAdmin если выбирать не саму базу данных, а отдельные таблицы, можно не всю таблицу тянуть, а лишь определённое число записей, например начиная с 58000, взять 20000.
Один файл заархивировать проще пареной репы - открываем файл, сжимаем полученную строку gzip так как это описано в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3788 сохраняем в новый файл - качаем - разархивируем. Не удобно большое количество файлов архивировать с сохранением структуры, так как под Windows утилиты tar нет (вернее может и есть, найти её чего-то не могу) http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4066.

   
 
 автор: Loki   (17.05.2005 в 01:17)   письмо автору
 
   для: cheops   (16.05.2005 в 01:15)
 

Забабахал я скриптик для архивации данный из mysql. приглашаю принять участие в тестировании. при желании процесс получения локальной копии можно полностью автоматизировать.

Вчера у меня сил на пояснения не оставалось, поэтому допишу сегодня:)
При запуске файла arc.php скрипт сканирует последовательно все таблицы в базе в поисках новых записей. Если он таковые находит, то он их складывает в архив с названием tableXXX-YYY.sql.gz, где table - имя таблицы, xxx - номер первой новой записи, yyy - номер последней новой записи. Данные экспортируются в виде sql запроса, так что потом это будет легко закинуть обратно в базу. Информация об обновлениях храниться в файле arc.txt. В файле config.php надо приписать данные для доступа к базе.
Таким образом, регулярно запуская данный скрипт (например, кроном), нам придется только вытаскивать сравнительно небольшие файлы обновлений.

   
 
 автор: cheops   (18.05.2005 в 00:16)   письмо автору
 
   для: Loki   (17.05.2005 в 01:17)
 

А какой должен быть формат arc.txt?

PS Вообще это достаточно интересный скрипт... Может ему дружественный Web-интерфейс добавить и в раздел downloads поместить?

   
 
 автор: Loki   (18.05.2005 в 08:58)   письмо автору
 
   для: cheops   (18.05.2005 в 00:16)
 

Формат arc.txt следующий:
(имя таблицы)-##-(порядковый номер последней экспортированной записи)\r\n
собственно, он автоматически формируется, так что единственное условие, что он должен существовать при запуске скрипта.
А какой, собственно, интерфейс ему нужен? Я вообще планировал запускать его автоматом и, если косяков нет, забыть про него совсем:)

   
 
 автор: cheops   (18.05.2005 в 23:36)   письмо автору
 
   для: Loki   (18.05.2005 в 08:58)
 

Вот возьмём среднестатистического пользователя (меня:), который сидит и чешет голову как бы ему запустить скрипт, например, для базы форума и не знает как подступиться к скрипту - его нужно обнадёжить, сказать куда мышкой тыкнуть, где конфигурационный файл подправить :))).

   
 
 автор: Loki   (19.05.2005 в 01:01)   письмо автору
 
   для: cheops   (18.05.2005 в 23:36)
 

Ну вы задачки задаете... readme.txt спасет отца русской демократии?:)

   
 
 автор: alik   (19.05.2005 в 02:17)   письмо автору
 
   для: Loki   (19.05.2005 в 01:01)
 

Классный скрипт. Я бы еще добавил несколько изменений.
Этот кусок сприпта -

while ($var=mysql_fetch_array($result))
{
 $arch.="INSERT INTO '$table' VALUES (";
 for ($i=0; $i<$num_fields; $i++)
 {
 $arch.="'".$var[$fields[$i]]."'";
 if ($i<($num_fields-1)) $arch.=",";
 }
 $arch.=");"."\r\n"; 
}

Изменил бы на

$arch = "<? \r\require_once \"config.php\"; \r\n\$dump =\r\n";
while (
$var=mysql_fetch_array($result))
{
 
$arch.="mysql_query(\"INSERT INTO '$table' VALUES (";
 for (
$i=0$i<$num_fields$i++)
 {
 
$arch.="'".$var[$fields[$i]]."'";
 if (
$i<($num_fields-1)) $arch.=",";
 }
 
$arch.=");\");"."\r\n"
}
$arch.="if (\$dump) echo \"Данные из таблицы <b>".$table."</b> добавлены\";\r\nelse { echo \"<b>Ошибка:</b> \".mysql_error(); exit(); } \r\n ?>";

Это упрощает импортирование таблицы после експорта.

   
 
 автор: Loki   (19.05.2005 в 08:58)   письмо автору
 
   для: alik   (19.05.2005 в 02:17)
 

Не очень понял что такое $dump. Ну и кроме того, я пока не планировал импортировать данные с помощью скрипта, так что дополнительные кавычки мне ни к чему. С другой стороны, гаждый волен перекраивать его под себя.

ЗЫ вам удалось обойти защиту форума:) При ответе на ваше сообщение, приведенный код выглядит так:

$arch = "<? 
Warning
Unexpected character in input'\' (ASCII=92) state=1 in /usr/hosting/softtime/html/utils/utils.php on line 42
r
Warning: Unexpected character in input: '
\' (ASCII=92) state=1 in /usr/hosting/softtime/html/utils/utils.php on line 42
n require_once 
Warning: Unexpected character in input: '
\' (ASCII=92) state=1 in /usr/hosting/softtime/html/utils/utils.php on line 42
"config.php\"; \r\n\$dump =\r\n"; 
while ($var=mysql_fetch_array($result)) 

$arch.="mysql_query(\"INSERT INTO '
$table' VALUES ("; 
for ($i=0; $i<$num_fields; $i++) 

$arch.="'".
$var[$fields[$i]]."'"; 
if ($i<($num_fields-1)) $arch.=","; 

$arch.=");\");"."\r\n"; 

$arch.="if (\$dump) echo \"Данные из таблицы <b>".$table."</b> добавлены\";\r\nelse { echo \"<b>Ошибка:</b> \".mysql_error(); exit(); } \r\n ?>"; 

   
 
 автор: denvor   (19.05.2005 в 10:55)   письмо автору
 
   для: Loki   (19.05.2005 в 08:58)
 

Браво, Loki !
Я как раз зашел на форум в поисках такой штуки - для крона. А кому нужен интерфейс - есть классный скрипт с русским интерфейсом Site Keeper Dumper LE 1.0.4 © 2003.
Он небольшой, умеет беакпить с сжатием (в чт - определенные таблицы по фильтру) и восстанавливать.

А скрипт сейчас попробую.
Сразу предложение - внести возможность не только перезаписывать дамп , а сохранять указанное число дампов, скажем - за последние 7 дней (при архивации раз в день) - если злоумышленники повредили базу, а ты заметил это не сразу, то потребуется не последний дамп, а один из предыдущих

   
 
 автор: Loki   (19.05.2005 в 17:42)   письмо автору
 
   для: denvor   (19.05.2005 в 10:55)
 

>Сразу предложение - внести возможность не только перезаписывать дамп
А дамп и не перезаписывается: создается новый.
например, было у вас в таблице ip 1000 записей. Это экспортируется в файл ip1-1000.sql.gz
За неделю добавилось еще 500 - рядом образуется файл ip1001-1500.sql.gz
То есть вам не надо каждый раз вытягивать полный дамп, а только ту информацию, которая добавилась.

   
 
 автор: alik   (19.05.2005 в 11:32)   письмо автору
 
   для: Loki   (19.05.2005 в 08:58)
 

Я имел ввиду что при экспроте в файле данные сохраняются в виде:

INSERT INTO 'table' VALUES ('1','Данные 1');
...
INSERT INTO 'table' VALUES ('2','Данные 2');

а я предложил вариант чуть-чуть другой:

<?
require_once "config.php";
 
$dump =
mysql_query("INSERT INTO 'table' VALUES ('1','Данные 1');");
...
mysql_query("INSERT INTO 'table' VALUES ('2','Данные 2');");
if (
$dump) echo "Данные из таблицы <b>$table</b> добавлены";
else { echo 
"<b>Ошибка:</b> ".mysql_error(); exit(); }
?>

   
 
 автор: Loki   (19.05.2005 в 13:18)   письмо автору
 
   для: alik   (19.05.2005 в 11:32)
 

Снова не понял.
Поясните мне что делает ваш скрипт. Если я правильно читаю код, то он должен дублировать записи в таблице. Что он вообще сохраняет в файл и в каком виде?

   
 
 автор: alik   (19.05.2005 в 17:02)   письмо автору
 
   для: Loki   (19.05.2005 в 13:18)
 

Да это я просто кусок фрагмента исправил из предложенного Вами скрипта. У Вас когда скрипт выполняется, то в архиве сохраняется файл *.sql с данными из таблицы. А я предложил Вам добавить строки которые в файл *.sql заносятся данные из таблицы и эти данные готовы к импорту в ту же таблицу (импорт средствами ПХП).

   
 
 автор: Loki   (19.05.2005 в 17:32)   письмо автору
 
   для: alik   (19.05.2005 в 17:02)
 

Лечение перхоти отсеканием головы:)
вместо того, чтобы добавить пол строчки к скипту для импорта, вы предлагаете добавить в дамп 16 (!) байт для каждой записи, кроме всего прочего, лишив себя возможности импорта данных средствами mysql!
Ваш вариант - дополнительный мегабайт с каждых 65536 записей!
Нееет, нам такая оптимизация не нужна!;)

   
 
 автор: alik   (19.05.2005 в 19:34)   письмо автору
 
   для: Loki   (19.05.2005 в 17:32)
 

Каждому своё. Я считаю так:
1. 16 байт - это не так уж много
2. Облегчает жизнь при импорте. Надо всего лишь запустить файл и все (т.е. время добавления данных в таблицу уменьшается в несколько раз)
3. Добавлять данные средствами MySQL - как? Все сводится к тому что данные добавляются через PHP.
4. Идея создания скриптa (скриптов) в основном лежит в том, чтобы облегчить работу малознающим пользователям.
(если я ошибся поправь).
P.S. Вот кое-что еще добавил в скрипт. Посмотри Loki.

   
 
 автор: Loki   (19.05.2005 в 20:05)   письмо автору
 
   для: alik   (19.05.2005 в 19:34)
 

1. если есть выбор добавить 16 байт в скрипт или в дамп, я предпочту скрипт:)
3.a) консоль
б) phpmyadmin
4. Идея лежит в том, чтобы автоматизировать процесс. Чтобы не держать это в голове, а все происходило само и регулярно. Я так понимаю задачу:)

Гм... если я правильно понимаю, то с помощью файла index.php можно выбрать базу для архивации... но для всех баз используется один логин и пароль. Значит, это root. Кто тут говорил о малознающих пользователях?:)))

   
 
 автор: alik   (19.05.2005 в 21:08)   письмо автору
 
   для: Loki   (19.05.2005 в 20:05)
 

Упс!!! Скрипт не доделан.

   
 
 автор: alik   (19.05.2005 в 21:42)   письмо автору
2.1 Кб
 
   для: alik   (19.05.2005 в 21:08)
 

Ну тогда остается сделать так. Смотри в файле.

   
 
 автор: denvor   (19.05.2005 в 22:25)   письмо автору
 
   для: alik   (19.05.2005 в 21:42)
 

Еще раз - биг сенькс! Прога то, что надо!

Только вопрос такой: если злоумышленник потер/изменил записи и/или таблицы , срипт перепишет их и восстановить будет невозможно?

   
 
 автор: Loki   (24.05.2005 в 16:29)   письмо автору
 
   для: denvor   (19.05.2005 в 22:25)
 

Нет. Скрипт сохраняет только новые записи (появившиеся после последней архивации), так что если злоумышленник даже полностью обнулит вашу базу, то резервная копия не пострадает.
правда, это накладывает определенные ограничения:
1. не архивируются старые измененные записи
2. не отслеживаются удаленные записи:
то-есть если вы удалили из базы после архивации десяток строк, а потом добавили десяток новых, то скрипт новый архив делать не будет, так как общее количество записей в таблице не увеличилось.
Если нужно, можно ручками поправить файл arc.txt и вписать туда порядковый номер последней заархивированной записи. Только править надо в виндовском блокноте - юниксовые переносы строк скрипт почему-то обрабатывает некорректно.

   
 
 автор: Loki   (19.05.2005 в 22:25)   письмо автору
 
   для: alik   (19.05.2005 в 21:42)
 

Собственно, как раз то, что я и не хотел делать: все вводить ручками... тогда уж лучше через phpmyadmin...
Может кому-то будет и удобно...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования