Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как написать BACKUP

2.3K
02 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Требуется следующие: чтобы при нажатие на кнопочку(ссылку), бэкап базы данных MySQL сохранялся на сервере в специально отведённой директории, уповаю только на вас, как это реализовать :devil: :???:
4
02 декабря 2003 года
mike
3.7K / / 01.10.2002
База любая или структура известна ???

Если нет, то получаем список таблиц про помощи
 
Код:
SHOW tables;

потом при помощи
 
Код:
DESCRIBE table;

получаем все поля, и формируем CREATE. (Аналогично с индексами)

Потом уже выбираем все данные из таблиц и форумируем INSERT'ы.

Получается большой файл с SQL запросами, выполнив которые ты получишь исходную базу данных.

Если есть возможность, то не мучайся, и используй mysqldump
300
03 декабря 2003 года
ReDrum
689 / / 20.04.2000
Ну для любой БД на MySQL пройдет конструкция
 
Код:
mysqldump --add-drop-table -u user_name -p database_name > file_name


Засунутая в system
2.3K
04 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Нужно чтобы бэкап производился трёх таблиц. Типа жмёшь кнопку бэкап, и происходит создание файла с расширением *.php и он сразу же сохранялся на сервере в определённой папке, не сочтите за трудность напишите как это сделать... :-?
4
04 декабря 2003 года
mike
3.7K / / 01.10.2002
Этож просто. Делаешь SELECT * из этих трех таблиц и пишешь в файл.

Формат файлак - какой душе угодно, можно CSV, а можно и SQL инструкции в стиле mysqldump
300
05 декабря 2003 года
ReDrum
689 / / 20.04.2000
Цитата:
Originally posted by mike
Этож просто. Делаешь SELECT * из этих трех таблиц и пишешь в файл.

Формат файлак - какой душе угодно, можно CSV, а можно и SQL инструкции в стиле mysqldump



Неакадемичный способ предложен ;)=
Допустим в таблицах содержиться очень много данных, и машина - дохлая. Следовательно имеем очень большое время исполнения скрипта. И здесь возникают траблы с корректным завершением работы программы.

Короче я к тому, что не корректно указаны условия задачи. А самое простое решение - не всегда идеальное ;)=

4
05 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by ReDrum
Неакадемичный способ предложен ;)=
Допустим в таблицах содержиться очень много данных, и машина - дохлая. Следовательно имеем очень большое время исполнения скрипта. И здесь возникают траблы с корректным завершением работы программы.



В то же время может не быть прав на запуск mysqldump

2.3K
05 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by mike
Этож просто. Делаешь SELECT * из этих трех таблиц и пишешь в файл.

Формат файлак - какой душе угодно, можно CSV, а можно и SQL инструкции в стиле mysqldump


Зная PHP на уровне Hello World, я позволил себе написать прям в вебе - вот такой код:
<?php
$host = 'localhost';
$user = 'user';
$pass = 'pass';
$data = 'test';
$db = mysql_connect($host, $user, $pass);
mysql_select_db($data, $db);
mysql_query("SELECT FROM * site_documents");
mysql_query("SELECT FROM * site_news");
mysql_query("SELECT FROM * site_users");

Вопрос: что делать дальше:???:

4
05 декабря 2003 года
mike
3.7K / / 01.10.2002
Сначала попробуй так:

 
Код:
<?
$host = 'localhost';
$user = 'user';
$pass = 'pass';
$data = 'test';

system("mysqldump --user=$user --password=$pass --host=$host $data >file.sql");
?>


Если не поможет, тогда примерно правильно написал. Осталось только все данные записать в файлы.
239
06 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Вообще-то это ни к чему. Все SQL-запросы сохраняются в логе MySQL. Я в свое время перепахал толстенный томик по MySQL, так там писали, что там все настолько адаптировано под юзера, что этот файл можно слазу использовать как SQL-файл. Вопрос в другом - как часто его чистит админ-хостер, дает ли доступ?
4
06 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet
Вообще-то это ни к чему. Все SQL-запросы сохраняются в логе MySQL. Я в свое время перепахал толстенный томик по MySQL, так там писали, что там все настолько адаптировано под юзера, что этот файл можно слазу использовать как SQL-файл. Вопрос в другом - как часто его чистит админ-хостер, дает ли доступ?



Нифига, не пойдет. Этот файл есть только в дебаг режиме. А mysql обычно в нем не работает.

У меня, например до 40 запросов в секунду. Прикинь что в логе будет :)

2.3K
06 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by mike
Сначала попробуй так:

 
Код:
<?
$host = 'localhost';
$user = 'user';
$pass = 'pass';
$data = 'test';

system("mysqldump --user=$user --password=$pass --host=$host $data >file.sql");
?>


Если не поможет, тогда примерно правильно написал. Осталось только все данные записать в файлы.


Так вот я и говорю - что делать дальше как выбранные таблицы записать в файл на сервере, всё что мне нужно так это сам код. Да и ввидемо нужно ввести ещё одну переменную типа $path = "$DOCUMENT_ROOT.'/reserve/'";
C созданным мной кодом помогите связать всё это воедино ;)

4
06 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by SystemRoot

Так вот я и говорю - что делать дальше как выбранные таблицы записать в файл на сервере, всё что мне нужно так это сам код. Да и ввидемо нужно ввести ещё одну переменную типа $path = "$DOCUMENT_ROOT.'/reserve/'";
C созданным мной кодом помогите связать всё это воедино ;)



RTFM.
http://www.codenet.ru/db/mysql/intro.php
http://www.codenet.ru/db/mysql/commands.php#Mysqldump

239
06 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by mike


Нифига, не пойдет. Этот файл есть только в дебаг режиме. А mysql обычно в нем не работает.

У меня, например до 40 запросов в секунду. Прикинь что в логе будет :)



... М-да... это верно.

А что мешает физический BackUp БД делать? Практически у всех хостеров можно попросить это сделать, если уже нет доступа через FTP. Тем блоее структура БД MySQL - это папка, в которой хранятся файлы-таблицы. ВСЕ!

Если BackUp делать раз-два в месяц, то этот вариант оптимальный, по моему мнению.

300
06 декабря 2003 года
ReDrum
689 / / 20.04.2000
Цитата:
Originally posted by SystemRoot

Так вот я и говорю - что делать дальше как выбранные таблицы записать в файл на сервере, всё что мне нужно так это сам код. Да и ввидемо нужно ввести ещё одну переменную типа $path = "$DOCUMENT_ROOT.'/reserve/'";
C созданным мной кодом помогите связать всё это воедино ;)



Вобщем не обязательно вводить.
Ты же перенаправляешь поток в файл, в данном случае file.sql м.б. задан как /absolute/path2file/some_timestamp.ext

4
06 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by Dolonet
А что мешает физический BackUp БД делать?



Гы :) тут не я вопрос задал :) У меня все бекапится как надо :)

239
06 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by mike


Гы :) тут не я вопрос задал :) У меня все бекапится как надо :)



:D :D :D
Да, ребята! Зачем же, действительно, в той же системе делать бэкап в соседнюю БД, если, скорее всего, если что-то рухнет, то рухнет и все остальное (я про тот случай, когда БД не подлежит восстановлению)! причем на это тратить уйму времени и нервов, возможно даже не пускать юзверей юзать эту базу при самом бэкапе!

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

Уважаемый SystemRoot, вопрос решен %)

2.3K
06 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by Dolonet


:D :D :D
Да, ребята! Зачем же, действительно, в той же системе делать бэкап в соседнюю БД, если, скорее всего, если что-то рухнет, то рухнет и все остальное (я про тот случай, когда БД не подлежит восстановлению)! причем на это тратить уйму времени и нервов, возможно даже не пускать юзверей юзать эту базу при самом бэкапе!

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

Уважаемый SystemRoot, вопрос решен %)


Не решён:x Эт же форум веб программеров, а я ответа не получил, тут все такие крутые, а толком нифига не сказали mysqldump - не канает он создаёт файл на сервере и там пустота X)-
Всё это делается для усовершенствования движка сайта кто ни хочет помогать пусть не заходит вообще в пост Dolonet - вопрос закрыть могу только "Я"!!! Вот основной код:. Мне нужен только PHP который и выполнит сбор всех ячеек и контента в базе

<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_documents, site_news, site_users";

/*Соединение с базой*/
ConnectDB();

/*Операция создания резерва базы*/
$data = mysql_query("SELECT * FROM $tables");

/*Вот сюда помощь!!!*/

/*Сохранение файла*/
$fw = fopen("$path$data$fname-$date.sql","w+");
fputs($fw,$data,strlen($data));

mysql_close();

?>

239
06 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by SystemRoot

Не решён:x Эт же форум веб программеров, а я ответа не получил, тут все такие крутые, а толком нифига не сказали mysqldump - не канает он создаёт файл на сервере и там пустота X)-
Всё это делается для усовершенствования движка сайта кто ни хочет помогать пусть не заходит вообще в пост Dolonet - вопрос закрыть могу только "Я"!!! Вот основной код:. Мне нужен только PHP который и выполнит сбор всех ячеек и контента в базе



Во-первых, я себя не считаю "крутым" - этот термин не для меня и не здесь. Я лишь торчу все выходные и вечера будней, чтобы помочь таким как ты и как я.


Теперь по проблеме. Ваианта 2:
1. Берешь и просишь хостера дать доступ на чтение и путь к папке MySQL. Полдела сделано. Если тебе надо взять несколько таблиц, берешь эти файлы (весь путь известен - путь к MySQL папке, название БД (тоже папка) и названия таблиц (название файла. По-моему, без расширения). Нельзя забывать про регистры!!. Копируешь файлы туда, где есть доступ на запись. Этот вариант может не прокатить, если админ не согласится давать прав.

2. В твой код на пустое место ставишь цикл. Я бы если таблицы не большие сделал бы преобразование одного символа в 2, тогда читал бы посторчно и располагал значения полей через знак табуляции, а записи через знак возврат каретки. Тогда увеличивается объем в 2 раза, функция выполняется куда дольше, чем копирование одного файла, приходится создавать еще один файл, надо делать функцию обратной обработки, которая тоже не быстрая.

Все....

2.3K
07 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by Dolonet


Во-первых, я себя не считаю "крутым" - этот термин не для меня и не здесь. Я лишь торчу все выходные и вечера будней, чтобы помочь таким как ты и как я.


Теперь по проблеме. Ваианта 2:
1. Берешь и просишь хостера дать доступ на чтение и путь к папке MySQL. Полдела сделано. Если тебе надо взять несколько таблиц, берешь эти файлы (весь путь известен - путь к MySQL папке, название БД (тоже папка) и названия таблиц (название файла. По-моему, без расширения). Нельзя забывать про регистры!!. Копируешь файлы туда, где есть доступ на запись. Этот вариант может не прокатить, если админ не согласится давать прав.

2. В твой код на пустое место ставишь цикл. Я бы если таблицы не большие сделал бы преобразование одного символа в 2, тогда читал бы посторчно и располагал значения полей через знак табуляции, а записи через знак возврат каретки. Тогда увеличивается объем в 2 раза, функция выполняется куда дольше, чем копирование одного файла, приходится создавать еще один файл, надо делать функцию обратной обработки, которая тоже не быстрая.

Все....


Блин, мы как на разных языках говорим :devil: Понятия класс и ещё всякие заморочки мне ничего ни говорят, если бы я знал как эт зделать, то ни писал ламерские вопросы в форуме, я же на протяжение всего времени прошу дать мне сам код, а ни советы и всё такое. Мне нужно это:
mysql_query("SELECT * FROM $tables");
и пошло поехало...
напишите кто нить хороший человек что писать реально дальше :angel:

239
07 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by SystemRoot

Блин, мы как на разных языках говорим :devil: Понятия класс и ещё всякие заморочки мне ничего ни говорят, если бы я знал как эт зделать, то ни писал ламерские вопросы в форуме, я же на протяжение всего времени прошу дать мне сам код, а ни советы и всё такое. Мне нужно это:
mysql_query("SELECT * FROM $tables");
и пошло поехало...
напишите кто нить хороший человек что писать реально дальше :angel:



если по шагам, то сейчас пиши письмо своему хостеру:
"Драсти, не могли бы Вы мне подсказать, доступны ли мне для чтения файлы БД MySQL? Если нет, то могли бы Вы открыть этот доступ? Общаю быть милым мальчиком, понимаете ли, я же для вас беспокоюсь, чтобы бэкап был у меня, чтобы не доставал Вас и все такое.
И последнее - подскажите плз путь к папке, где содержатся папки Баз Данных, чтобы я их оккуратно юзал из PHP."

Кто тебе такой умный сказал, что тут можно обойтись только одним случаем, который ты написал? Это программирование, и тут есть масса вариантов. Рекомендую делать через физические файлы. Надежнее, проще и быстрее ничего не придумать!

4
07 декабря 2003 года
mike
3.7K / / 01.10.2002
Если mysqldump создает пустой файл, то это уже неплохо. Поразбирайся, он создаст и непустой.

Ты вообще представляешь что ты выберешь запросом
SELECT * FROM site_documents, site_news, site_users ??? Читай для начала доки по SQL.

Все что написано ниже, писалось прямо тут и может не работать.

Код:
<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_documents, site_news, site_users";

/*Соединение с базой*/
ConnectDB();

/*Сохранение файла*/
$fw = fopen($path.$data.$fname."-".$date.".sql","w+");

$a_tables=explode(",",$tables);
while (list ($key, $tname) = each ($a_tables)) {
    $r=mysql_query("SELECT * FROM ".trim($tname));
    while ($a=mysql_fetch_array($r)) {
        fputs($fw,"INSERT INTO ".trim($tname)." SET ");
        while (list ($key, $val) = each ($a)) {
            fputs($fw,$key."='".AddSlashes($val)."'");
            }
        fputs($fw,"\n");
        }
    }
mysql_close();

?>


P.S. Никогда не пиши переменные внутри строк. Это сильно замедляет выполнение PHP скриптов. Не print "$a+$b=$c"; а print $a."+".$b."=".$c;
4
07 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Рекомендую делать через физические файлы. Надежнее, проще и быстрее ничего не придумать!



А вот это зря.
mysqldump не так просто придуман. Я сам пробовал бекапится разными способами.

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

А тут делам mysqldump, потом прогоняем полученные файл с помощью утилиты diff - и получаемь лишь отличие текущего от предыдущего. Немерянная экономия места (для бекапов это актуально)

А еще лучше прикручиываем базы к cvs и делаем просто "cvs commit". Потом просто говорим дату, до которой надо откатиться и получаемь нужный файл.

2.3K
07 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by mike
Если mysqldump создает пустой файл, то это уже неплохо. Поразбирайся, он создаст и непустой.

Ты вообще представляешь что ты выберешь запросом
SELECT * FROM site_documents, site_news, site_users ??? Читай для начала доки по SQL.

Все что написано ниже, писалось прямо тут и может не работать.

Код:
<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_documents, site_news, site_users";

/*Соединение с базой*/
ConnectDB();

/*Сохранение файла*/
$fw = fopen($path.$data.$fname."-".$date.".sql","w+");

$a_tables=explode(",",$tables);
while (list ($key, $tname) = each ($a_tables)) {
    $r=mysql_query("SELECT * FROM ".trim($tname));
    while ($a=mysql_fetch_array($r)) {
        fputs($fw,"INSERT INTO ".trim($tname)." SET ");
        while (list ($key, $val) = each ($a)) {
            fputs($fw,$key."='".AddSlashes($val)."'");
            }
        fputs($fw,"\n");
        }
    }
mysql_close();

?>


P.S. Никогда не пиши переменные внутри строк. Это сильно замедляет выполнение PHP скриптов. Не print "$a+$b=$c"; а print $a."+".$b."=".$c;


mike - спасиб тебе огромное, он теперь бэкапит, только одно, но, систаксис для SQL ни тот при восстановление базы пишет error systax и всё такое, ну с этой траблой думаю справлюсь, ещё раз всех благодарю, за ваше терпение и нервы...

2.3K
07 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Тут теперь такой трабл :)
Вот код без всяких ошибок :D
Код:
<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_users";

/*Соединение с базой*/
ConnectDB();

/*Сохранение файла*/
$fw = fopen($path.$fname."-".$date.".sql","w+");

$a_tables=explode(",",$tables);
while (list ($key, $tname) = each ($a_tables)) {
    $r=mysql_query("SELECT * FROM ".trim($tname));
    while ($a=mysql_fetch_array($r)) {
        fputs($fw,"INSERT INTO ".trim($tname)." SET ");
        while (list ($key, $val) = each ($a)) {
            fputs($fw,$key."=".AddSlashes($val)."'");
            }
        fputs($fw,"\n");
        }
    }
mysql_close();

?>

Он сохраняет файл с таким синтексисом -
INSERT INTO site_users SET 0=Root'login=Root'1=055686da60eab4d8f8edc76d1b837ab6'password=055686da60eab4d8f8edc76d1b837ab6'2=admin'access=admin'
, а нужно:
INSERT INTO `site_users` (`login`, `password`, `access`) VALUES ('Root', 'b14d8f8edc76d1b837ab690bf60eabda', 'admin'),
вопрос :???: как привести к токому виду ,помогите закончить :angel:
4
07 декабря 2003 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by SystemRoot
нужно:
INSERT INTO `site_users` (`login`, `password`, `access`) VALUES ('Root', 'b14d8f8edc76d1b837ab690bf60eabda', 'admin'),
вопрос :???: как привести к токому виду ,помогите закончить :angel:



Руки то у тебя есть?? Уже все разжевали, в ротик положили, осталось только проглотить !!!!

А чем тебе не нравится вариант:

INSERT INTO site_users SET login='Root', password='055686da60eab4d8f8edc76d1b837ab6', access='admin'; ???

вот исправленный код:

Код:
<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_users";

/*Соединение с базой*/
ConnectDB();

/*Сохранение файла*/
$fw = fopen($path.$fname."-".$date.".sql","w+");

$a_tables=explode(",",$tables);
while (list ($key, $tname) = each ($a_tables)) {
    $r=mysql_query("SELECT * FROM ".trim($tname));
    while ($a=mysql_fetch_array($r)) {
        fputs($fw,"INSERT INTO ".trim($tname)." SET ");
        $str="";
        while (list ($key, $val) = each ($a)) {
            if (!is_numeric($key)) {
                $str.=$key."='".AddSlashes($val)."', ");
                }
            }
        fputs($fw,substr($str,0,-2)."\n");
        }
    }
mysql_close();

?>
2.3K
07 декабря 2003 года
SystemRoot
51 / / 30.11.2003
Цитата:
Originally posted by mike


Руки то у тебя есть?? Уже все разжевали, в ротик положили, осталось только проглотить !!!!

А чем тебе не нравится вариант:

INSERT INTO site_users SET login='Root', password='055686da60eab4d8f8edc76d1b837ab6', access='admin'; ???

вот исправленный код:

Код:
<?php

include($_SERVER["DOCUMENT_ROOT"]."/engine/config.php");
include($core_path."include/db.php");

/*Основные переменные*/
$path = $server_root."reserve/";
$date = date('d.m.Y');
$fname = "Backup";
$tables = "site_users";

/*Соединение с базой*/
ConnectDB();

/*Сохранение файла*/
$fw = fopen($path.$fname."-".$date.".sql","w+");

$a_tables=explode(",",$tables);
while (list ($key, $tname) = each ($a_tables)) {
    $r=mysql_query("SELECT * FROM ".trim($tname));
    while ($a=mysql_fetch_array($r)) {
        fputs($fw,"INSERT INTO ".trim($tname)." SET ");
        $str="";
        while (list ($key, $val) = each ($a)) {
            if (!is_numeric($key)) {
                $str.=$key."='".AddSlashes($val)."', ");
                }
            }
        fputs($fw,substr($str,0,-2)."\n");
        }
    }
mysql_close();

?>


Руки то есть :D , а знаний в PHP пока не хватает :( Я щас занимаюсь как раз его изучением, погодите... через пол годика, мож раньше будем вместе советы довать :D Код проверю чуть позже, о результате сообщю...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог