LINUX.ORG.RU

[лень] [solution] [i hate php] DIY бэкап базы данных

 


0

0

Оказывается, хостер запретил system().
Делать бэкап через phpmyadmin лень.

<?php
require("functions.php");

auth();

$db=connect_mysql_db();
$result=mysql_query("SELECT * FROM table", $db);

header('Content-type: application/x-gzip');
header('Content-Disposition: attachment; filename="your_domain_' .
       date("Ymd") . '.sql.gz"');

ob_start("ob_gzhandler");

print ";" . date(DATE_RFC822) . "\n";

while ($elem=mysql_fetch_assoc($result))
  {
    $s = "INSERT INTO `table` VALUES (";
    foreach ($elem as $id => $value) {
      $s .= '\'' . addslashes($value) . '\'' . ", ";
    }
    $s = rtrim($s, ', ');
    $s .= ");\n";
    print $s;
  }


mysql_free_result($result);
mysql_close($db);


?>

Как-то так. auth() и connect_mysql_db() предлагаются читателю в качестве упражнения.
★★★★

Ответ на: комментарий от KRoN73

>сколько лет

А, кстати, сколько? Этот код работает уже больше восьми лет ) Правда, с некоторыми модификациями.

Davidov ★★★★
() автор топика
Ответ на: комментарий от KRoN73

> Интересно, сколько лет я уже не дёргаю напрямую mysql-функции в PHP? :)

...Столько же, сколько не пишу на php? :)

naryl ★★★★★
()
Ответ на: комментарий от Davidov

>Есть годами работающий legacy код.

Я про то же и говорю :) У меня просто mysql-драйвер был написан лет
пять назад. И с тех пор практически не трогался. За первые года три
расширений и доработок превратился в ужас, но работает отлично :)

У меня этот дамп будет выглядеть... Сейчас, слеплю тест, чтобы точно работал...

Ага, вот:

<?php

define('BORS_CORE', '/var/www/.bors/bors-core');
define('BORS_LOCAL', '/var/www/.bors/bors-airbase');

require_once(BORS_CORE.'/config.php');

$table = 'bors_class_names';

$dbh = new DataBase('BORS');

$dbh->query("SELECT * FROM $table");

while($row = $dbh->fetch())
    echo "INSERT INTO `$table` ".$dbh->make_string_values($row).";\n";

Пришлось дёргать низкоуровневые query и fetch, т.к. запрос в общем
случае может не влезать в память, так что-построчно.

Вывод такой:

INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('1','forum_post') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('2','forum_topic') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('3','users_warning') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('4','forum_user') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('5','user_image_reputation') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('6','forum_main') ;
INSERT INTO `bors_class_names`  (`id`,`name`) VALUES ('7','user_reputation') ;

...

Естественно, что экранирование управляющих символов на уровне драйвера сделано.

Можно без прямого указания ключей:

while($row = $dbh->fetch())
    echo "INSERT INTO `$table` ".$dbh->make_string_values($row, false).";\n";

INSERT INTO `bors_class_names`  ('1','forum_post') ;
INSERT INTO `bors_class_names`  ('2','forum_topic') ;
INSERT INTO `bors_class_names`  ('3','users_warning') ;
INSERT INTO `bors_class_names`  ('4','forum_user') ;
INSERT INTO `bors_class_names`  ('5','user_image_reputation') ;
INSERT INTO `bors_class_names`  ('6','forum_main') ;

Можно мультивставку, но тогда вообще придётся лезть во внутренние переменные,
мультивставки у меня только на высоком уровне задействованы.
Плюс мне лениво делать серии сбросов, так что в примере - всё в память.

INSERT INTO bors_class_names  (`id`,`name`) VALUES ('1','forum_post') , ('2','forum_topic') , ('3','users_warning')...

KRoN73 ★★★★★
()
Ответ на: комментарий от naryl

>...Столько же, сколько не пишу на php? :)

Да нет, прямо сегодня уже пару десятков строк написал. Не считая этих примеров :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Тьфу, код с мультвставкой не привёл:

$dbh->multi_insert_init($table);
while($row = $dbh->fetch())
    $dbh->multi_insert_add($table, $row);

echo "INSERT INTO $table ".join(",", $dbh->insert_buffer[$table]).";\n";

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

С многими фреймворками писать такой код не было бы необходимости, т.к. в них присутствуют встроенные средства бэкапа. Да и, как правило, имеется доступ к shell (mysqldump).

А в том случае, когда основной код уже есть, и он написан на чистом PHP, такой скрипт может пригодиться.

Davidov ★★★★
() автор топика
Ответ на: комментарий от isden

>а схемы таблиц кто будет дергать? :)

Ну, я так понимаю, это чисто зарядка для ума :) А так - всего один вызов "show create table xxxx".

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ну вот, опять вы свой быдлофреймворк рекламируете.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.