|
|
|
| Есть проблема: база разрослась до определенного размера и забакапить через phpmyadmin не получается (видимо, скрипт вылетает по таймауту не успев полностью сформировать файл для экспорта), а базу заархивить хочется, так как хостер этого не делает.
Как быть в этом случае? Можно написать скрипт, который бы писал данные в файл (частями, например). Но файл при этом будут совершенно неприличных размеров (если без архивации, а с архивацией я не знаю как сделать).
Как быть? Какие есть варианты? В конце концов, как сделать архивацию?:) | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: cheops
(16.05.2005 в 01:15)
| | Забабахал я скриптик для архивации данный из mysql. приглашаю принять участие в тестировании. при желании процесс получения локальной копии можно полностью автоматизировать.
Вчера у меня сил на пояснения не оставалось, поэтому допишу сегодня:)
При запуске файла arc.php скрипт сканирует последовательно все таблицы в базе в поисках новых записей. Если он таковые находит, то он их складывает в архив с названием tableXXX-YYY.sql.gz, где table - имя таблицы, xxx - номер первой новой записи, yyy - номер последней новой записи. Данные экспортируются в виде sql запроса, так что потом это будет легко закинуть обратно в базу. Информация об обновлениях храниться в файле arc.txt. В файле config.php надо приписать данные для доступа к базе.
Таким образом, регулярно запуская данный скрипт (например, кроном), нам придется только вытаскивать сравнительно небольшие файлы обновлений. | |
|
|
|
|
|
|
|
для: Loki
(17.05.2005 в 01:17)
| | А какой должен быть формат arc.txt?
PS Вообще это достаточно интересный скрипт... Может ему дружественный Web-интерфейс добавить и в раздел downloads поместить? | |
|
|
|
|
|
|
|
для: cheops
(18.05.2005 в 00:16)
| | Формат arc.txt следующий:
(имя таблицы)-##-(порядковый номер последней экспортированной записи)\r\n
собственно, он автоматически формируется, так что единственное условие, что он должен существовать при запуске скрипта.
А какой, собственно, интерфейс ему нужен? Я вообще планировал запускать его автоматом и, если косяков нет, забыть про него совсем:) | |
|
|
|
|
|
|
|
для: Loki
(18.05.2005 в 08:58)
| | Вот возьмём среднестатистического пользователя (меня:), который сидит и чешет голову как бы ему запустить скрипт, например, для базы форума и не знает как подступиться к скрипту - его нужно обнадёжить, сказать куда мышкой тыкнуть, где конфигурационный файл подправить :))). | |
|
|
|
|
|
|
|
для: cheops
(18.05.2005 в 23:36)
| | Ну вы задачки задаете... readme.txt спасет отца русской демократии?:) | |
|
|
|
|
|
|
|
для: 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\n 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 ?>";
|
Это упрощает импортирование таблицы после експорта. | |
|
|
|
|
|
|
|
для: 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 ?>";
|
| |
|
|
|
|
|
|
|
для: Loki
(19.05.2005 в 08:58)
| | Браво, Loki !
Я как раз зашел на форум в поисках такой штуки - для крона. А кому нужен интерфейс - есть классный скрипт с русским интерфейсом Site Keeper Dumper LE 1.0.4 © 2003.
Он небольшой, умеет беакпить с сжатием (в чт - определенные таблицы по фильтру) и восстанавливать.
А скрипт сейчас попробую.
Сразу предложение - внести возможность не только перезаписывать дамп , а сохранять указанное число дампов, скажем - за последние 7 дней (при архивации раз в день) - если злоумышленники повредили базу, а ты заметил это не сразу, то потребуется не последний дамп, а один из предыдущих | |
|
|
|
|
|
|
|
для: denvor
(19.05.2005 в 10:55)
| | >Сразу предложение - внести возможность не только перезаписывать дамп
А дамп и не перезаписывается: создается новый.
например, было у вас в таблице ip 1000 записей. Это экспортируется в файл ip1-1000.sql.gz
За неделю добавилось еще 500 - рядом образуется файл ip1001-1500.sql.gz
То есть вам не надо каждый раз вытягивать полный дамп, а только ту информацию, которая добавилась. | |
|
|
|
|
|
|
|
для: 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(); }
?>
|
| |
|
|
|
|
|
|
|
для: alik
(19.05.2005 в 11:32)
| | Снова не понял.
Поясните мне что делает ваш скрипт. Если я правильно читаю код, то он должен дублировать записи в таблице. Что он вообще сохраняет в файл и в каком виде? | |
|
|
|
|
|
|
|
для: Loki
(19.05.2005 в 13:18)
| | Да это я просто кусок фрагмента исправил из предложенного Вами скрипта. У Вас когда скрипт выполняется, то в архиве сохраняется файл *.sql с данными из таблицы. А я предложил Вам добавить строки которые в файл *.sql заносятся данные из таблицы и эти данные готовы к импорту в ту же таблицу (импорт средствами ПХП). | |
|
|
|
|
|
|
|
для: alik
(19.05.2005 в 17:02)
| | Лечение перхоти отсеканием головы:)
вместо того, чтобы добавить пол строчки к скипту для импорта, вы предлагаете добавить в дамп 16 (!) байт для каждой записи, кроме всего прочего, лишив себя возможности импорта данных средствами mysql!
Ваш вариант - дополнительный мегабайт с каждых 65536 записей!
Нееет, нам такая оптимизация не нужна!;) | |
|
|
|
|
|
|
|
для: Loki
(19.05.2005 в 17:32)
| | Каждому своё. Я считаю так:
1. 16 байт - это не так уж много
2. Облегчает жизнь при импорте. Надо всего лишь запустить файл и все (т.е. время добавления данных в таблицу уменьшается в несколько раз)
3. Добавлять данные средствами MySQL - как? Все сводится к тому что данные добавляются через PHP.
4. Идея создания скриптa (скриптов) в основном лежит в том, чтобы облегчить работу малознающим пользователям.
(если я ошибся поправь).
P.S. Вот кое-что еще добавил в скрипт. Посмотри Loki. | |
|
|
|
|
|
|
|
для: alik
(19.05.2005 в 19:34)
| | 1. если есть выбор добавить 16 байт в скрипт или в дамп, я предпочту скрипт:)
3.a) консоль
б) phpmyadmin
4. Идея лежит в том, чтобы автоматизировать процесс. Чтобы не держать это в голове, а все происходило само и регулярно. Я так понимаю задачу:)
Гм... если я правильно понимаю, то с помощью файла index.php можно выбрать базу для архивации... но для всех баз используется один логин и пароль. Значит, это root. Кто тут говорил о малознающих пользователях?:))) | |
|
|
|
|
|
|
|
для: Loki
(19.05.2005 в 20:05)
| | Упс!!! Скрипт не доделан. | |
|
|
|
|
 2.1 Кб |
|
|
для: alik
(19.05.2005 в 21:08)
| | Ну тогда остается сделать так. Смотри в файле. | |
|
|
|
|
|
|
|
для: alik
(19.05.2005 в 21:42)
| | Еще раз - биг сенькс! Прога то, что надо!
Только вопрос такой: если злоумышленник потер/изменил записи и/или таблицы , срипт перепишет их и восстановить будет невозможно? | |
|
|
|
|
|
|
|
для: denvor
(19.05.2005 в 22:25)
| | Нет. Скрипт сохраняет только новые записи (появившиеся после последней архивации), так что если злоумышленник даже полностью обнулит вашу базу, то резервная копия не пострадает.
правда, это накладывает определенные ограничения:
1. не архивируются старые измененные записи
2. не отслеживаются удаленные записи:
то-есть если вы удалили из базы после архивации десяток строк, а потом добавили десяток новых, то скрипт новый архив делать не будет, так как общее количество записей в таблице не увеличилось.
Если нужно, можно ручками поправить файл arc.txt и вписать туда порядковый номер последней заархивированной записи. Только править надо в виндовском блокноте - юниксовые переносы строк скрипт почему-то обрабатывает некорректно. | |
|
|
|
|
|
|
|
для: alik
(19.05.2005 в 21:42)
| | Собственно, как раз то, что я и не хотел делать: все вводить ручками... тогда уж лучше через phpmyadmin...
Может кому-то будет и удобно... | |
|
|
|