Slyweb
На разработку сайта! Скидки 50%!

Копирую, копирую, копирую…

Копирую, копирую, копирую…

Сколько времени приходится тратить на копирование данных, перед тем как приступить к их модификации, перенос или восстановление? Много. А его можно сэкономить, зная инструменты, специально созданные для копирования и восстановления данных.

Существует достаточно обширный перечень инструментов восстановления данных.

Первый способ, - копирование данных «родными» инструментами CMS или других веб-приложений.

Например, в Drupal есть модуль «Backup and Migrate», в Joomla компонент «Akeeba Backup», в Worpress плагин «UpdraftPlus Backup» или попросту «PhpMyAdmin»!

Все из них достаточно удобны, но копировать и восстанавливать данные указанными способами не всегда получается из ограничения хостинга!

Да и времени уходит гораздо больше, нужно зайти в админ раздел, подождать выполнение скрипта и скачивание архивного файла. Некоторые пользователи иногда начинают через «PhpMyAdmin» копировать частями таблицы, так как всю сразу базу не получается экспортировать и сохранить. Поэтому эти способы второстепенны.

Второй способ, - mysqldump.

Для копирования данных есть более удобный способ использовать команду mysqldump, а для восстановления команда mysql, но если у Вас есть доступ к SHH.

Создать копию базы «drupal7» в /var/www/fromniigata/data/www/

  • Код
  • Чистый код
  • Копировать в буфер
  1.mysqldump -uroot -p drupal7 > /var/www/fromniigata/data/www/backup-drupal7.sql

        

Опции

-uroot -p

Пользователь «root» пароль ****

Далее создать резервный файл в сжатом виде:

  • Код
  • Чистый код
  • Копировать в буфер
  1.tar cvzf backup-drupal7.gz backup-drupal7.sql

        

Сейчас создать резервною копию сайта вместе с sql дампом:

  • Код
  • Чистый код
  • Копировать в буфер
  1.tar cvzf backup.tar.gz * --exclude=backup-a14860_indivip.sql

        

Если вам нужен только дамп базы с её последующим сжатием, можно использовать следующую команду:

  • Код
  • Чистый код
  • Копировать в буфер
  1.mysqldump -u username -h localhost -p database_name | gzip -9 > backup_db.sql.gz

        

(этот способ является самым быстрым и экономящим время на сегодняшний день, и выбранный мной в качестве наилучшего средства резервного копирования данных!)

Однако, если Вы попытаетесь обычным способом восстановить полученный файл, например, через «phpMyadmin», у Вас вряд ли что-то получится. К тому же открыть и прочитать этот файл так же не всегда возможно.

Для этого нужно использовать команду mysql, указав базу и файла дампа:

Восстанавливаем базу данных:

  • Код
  • Чистый код
  • Копировать в буфер
  1.mysql -u username -p test < /var/www/fromniigata/data/www/backup-drupal7.sql

        

Эта команда создаст в базе test таблицы из backup-drupal7.sql

Можно оптимизировать весь процесс резервного копирования через cron:

  • Код
  • Чистый код
  • Копировать в буфер
  1.15 2 * * * root mysqldump -u root –p PASSWORD --all-databases | gzip > /mnt/disk2/base.sql.gz

        

Команды для копирования файлов

Создать копию текущей директории с исключением из архива всех файолов "/pathtoexclude/*"

  • Код
  • Чистый код
  • Копировать в буфер
  1.sudo tar cvzf backup.tar.gz * --exclude=/pathtoexclude/*

        

Создать копию директории /home/jquery в архив "archivefile3.zip":

  • Код
  • Чистый код
  • Копировать в буфер
  1.zip -r archivefile3 /home/jquery

        

Аналог предыдущей команды:

  • Код
  • Чистый код
  • Копировать в буфер
  1.zip -r archivefile3 .

        

PHP скрипты для копирования.

Ещё в качестве способа оптимизации резервного копирования можно использовать PHP:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<?php
  2.// Создание резервной копии данных
  3.// данные нужно изменить под ваши нужды
  4.$dbhost = "localshot";
  5.
  6.$dbuser = "yourusername";
  7.$dbpass = "yourpassword";
  8.$dbname = "yourdb";
  9.
10.$sendto = "Webmaster <webmaster@yourdomain.com>";
11.$sendfrom = "Automated Backup <backup@yourdomain.com>";
12.$sendsubject = "Daily Mysql Backup";
13.$bodyofemail = "Here is the daily backup.";
14.// don't need to edit below this section
15.$backupfile = $dbname . date("Y-m-d") . '.sql';
16.system("mysqldump -h $dbhost -u $dbuser -p$dbpass $dbname > $backupfile");
17.
18.// Mail the file
19.
20.include('Mail.php');
21.include('Mail/mime.php');
22.
23.$message = new Mail_mime();
24.$text = "$bodyofemail";
25.$message->setTXTBody($text);
26.$message->AddAttachment($backupfile);
27.$body = $message->get();
28.$extraheaders = array("From"=>"$sendfrom", "Subject"=>"$sendsubject");
29.$headers = $message->headers($extraheaders);
30.$mail = Mail::factory("mail");
31.$mail->send("$sendto", $headers, $body);
32.
33.// После отправки файла можно его удалить
34.unlink($backupfile);
35.?>

        

Иногда заказчик просит переводить резервную копию на облачный сервис, для этого я использую следующий скрипт на drupal, который можно быстро приспособить под резервное копирование но только на Drupal 7 и при условии работы вместе с модулем «Backup and Migrate»:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<?php
  2.function all_linsoft_ui_manual_backup_perform($settings) {
  3.
  4.    $ydl = variable_get("yandex_disk_login", 0);
  5.    $ydp = variable_get("yandex_disk_password", 0);
  6.    $yde = variable_get("yandex_disk_enabled", 0);
  7.    $yds = variable_get("yandex_disk_secretkey", '');
  8.    var_dump($settings->key);
  9.    if($yds !==md5($settings->key)) return false;
10.    
11. // Peform the actual backup.
12. if(!extension_loaded('openssl')) {
13.     watchdog('Yandex Disk! Error!', 'php openssl dll not found');
14.    //drupal_set_message('Ошибка при создании файла резервной базы! Нет такого файла "'.$pathtofile.'"');
15.    return false;
16. }
17. if(!extension_loaded('zip')) {
18.     watchdog('Yandex Disk! Error!', 'php zip dll not found');
19.    //drupal_set_message('Ошибка при создании файла резервной базы! Нет такого файла "'.$pathtofile.'"');
20.    return false;
21. }
22.
23. $file = backup_migrate_perform_backup($settings);
24. $pathtofile = $_SERVER['DOCUMENT_ROOT'].'/sites/default/files/backup_migrate/manual/'.$file->file_info['filename'].'.mysql.'.$file->type['extension'];
25. $name = $file->file_info['filename'].'.mysql.'.$file->type['extension'];
26. if(!is_file($pathtofile)) {
27.    watchdog('debug', 'Ошибка при создании файла резервной базы! Нет такого файла "'.$pathtofile.'"');
28.    //drupal_set_message('Ошибка при создании файла резервной базы! Нет такого файла "'.$pathtofile.'"');
29.    return false;
30. }
31.
32.
33.
34.
35. all_linsoft_include('zipclass');
36. all_linsoft_include('class_webdav_client');
37.    
38.    
39.
40.
41. $the_folder = $_SERVER['DOCUMENT_ROOT'].'/sites';
42. $zip_file_name = $_SERVER['DOCUMENT_ROOT'].'/sites/default/files/fuulsitearchive.zip';
43. if(is_file($zip_file_name)) {
44.     if(unlink($zip_file_name)) {
45.        watchdog('debug', 'Oldest files to Yandex disk was to delete!');
46.     } else {
47.        watchdog('error', 'Oldest files to Yandex disk was not delete! You have not access!');
48.     }
49. }
50.
51. $za = new FlxZipArchive;
52.
53. $res = $za->open($zip_file_name, ZipArchive::CREATE);
54.
55. if($res === TRUE) {
56.    $za->addDir($the_folder, basename($the_folder), array('manual','scheduled'));
57.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/includes', basename($_SERVER['DOCUMENT_ROOT'].'/includes'), array('manual'));
58.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/misc', basename($_SERVER['DOCUMENT_ROOT'].'/misc'), array('manual'));
59.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/mlsqrpt', basename($_SERVER['DOCUMENT_ROOT'].'/mlsqrpt'), array('manual'));
60.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/modules', basename($_SERVER['DOCUMENT_ROOT'].'/modules'), array('manual'));
61.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/scripts', basename($_SERVER['DOCUMENT_ROOT'].'/scripts'), array('manual'));
62.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/profiles', basename($_SERVER['DOCUMENT_ROOT'].'/profiles'), array('manual'));
63.    $za->addDir($_SERVER['DOCUMENT_ROOT'].'/themes', basename($_SERVER['DOCUMENT_ROOT'].'/themes'), array('manual'));
64.    
65.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/index.php','index.php');
66.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/cron.php','cron.php');
67.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/update.php','update.php');
68.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/xmlrpc.php','xmlrpc.php');
69.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/Sitemap.xml','sitemap.xml');
70.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/googleac3b7a35d73c4def.html','googleac3b7a35d73c4def.html');
71.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/yandex_79ba9c61de64ea6f.html','yandex_79ba9c61de64ea6f.html');
72.     $za->addFile($_SERVER['DOCUMENT_ROOT'].'/.htaccess','.htaccess');
73.     $za->addFile($pathtofile,$name);
74.
75.     $za->close();
76.    watchdog('debug', 'Zip arhive to Yandex disk was :created!');
77. }
78. else
79.    watchdog('error', 'Zip arhive to Yandex disk was not created! Error!');
80.    
81.    
82.    if(!is_file($zip_file_name)) {
83.        watchdog('error', 'Where file?!');
84.        return false;
85.    }
86. if(is_file($pathtofile)) {
87.     if(unlink($pathtofile)) {
88.        watchdog('debug', 'Backup SQL dump delete!');
89.     } else {
90.        watchdog('error', 'Backup SQL dump not delete!');
91.     }
92. }
93.
94. //error_reporting( -1 );
95. //ini_set("display_errors", 1);
96.
97. if ( !class_exists( 'webdav_client' ) )
98. {
99.     require('class_webdav_client.php');
100. }
101.
102. $wdc = new webdav_client();
103. $wdc->set_server( 'ssl://webdav.yandex.ru' );
104. $wdc->set_port( 443 );
105. $wdc->set_user( $ydl );
106. $wdc->set_pass( $ydp );
107. // use HTTP/1.1
108. $wdc->set_protocol( 1 );
109. // enable debugging
110. $wdc->set_debug( false );
111.
112.
113. if ( !$wdc->open() )
114. {
115.     watchdog('debug', 'Error: could not open server connection <br /> \r\n');
116.
117.     exit;
118. }
119.
120. // check if server supports webdav rfc 2518
121. if ( !$wdc->check_webdav() )
122. {
123.     print 'Error: server does not support webdav or user/password may be wrong <br /> \r\n';
124.     exit;
125. }
126.
127. $http_status = $wdc->mkcol( "/linsoft" );
128.
129. $http_status = $wdc->put_file( "/linsoft/" . $name, $zip_file_name );
130. //print 'webdav server returns ' . $http_status. "<br/ > \r\n";
131. watchdog('debug', 'webdav server returns ' . $http_status. '<br/ > \r\n');
132.
133. $urlToThePublishedFile = $wdc->filePublish( "/linsoft/$name" );
134. //print 'link to the published file: ' . $urlToThePublishedFile. "<br/ > \r\n";
135.
136. $fileUnpublishinStatus = $wdc->fileUnPublish( "/linsoft/$name" );
137. if ( $fileUnpublishinStatus )
138. {
139.     echo "File UnPublished correctly <br /> \r\n";
140. } else
141. {
142.     echo "Some errors occured on file UnPublish <br /> \r\n";
143. }
144.
145. if ( $wdc->get_file( "/soutcast/woman/gogo/2_1.jpg", "1.jpg" ) )
146. {
147.     Echo "returned true <br /> \r\n";
148. } else
149. {
150.     Echo "returned false <br />\r\n";
151. }
152.
153. if ( $wdc->get_file( "/soutcast/woman/gogo/2_2.jpg", "2.jpg" ) )
154. {
155.     Echo "returned true <br />\r\n";
156. } else
157. {
158.     Echo "returned false <br />\r\n";
159. }
160.
161. if ( $wdc->get_file( "/soutcast/woman/gogo/1arhiv.rar", "1arhiv.rar" ) )
162. {
163.     Echo "returned true <br />\r\n";
164. } else
165. {
166.     Echo "returned false <br />\r\n";
167. }
168.
169.
170.
171. $wdc->close();
172. flush();
173.
174.}
175.?>

        

Этот скрипт можно приспособить под любые нужды при копировании данных на Яндекс диск. Для этого скачайте класс PHP «class_webdav_client.php» с адреса phpYandexDisk, класс FlxZipArchive общедоступен, один из его вариантов:

  • Код
  • Чистый код
  • Копировать в буфер
  1./**
  2.* FlxZipArchive, Extends ZipArchiv.
  3.* Add Dirs with Files and Subdirs.
  4.*
  5.* <code>
  6.* $archive = new FlxZipArchive;
  7.* // .....
  8.* $archive->addDir( 'test/blub', 'blub' );
  9.* </code>
10.*/
11.class FlxZipArchive extends ZipArchive {
12.    /**
13.     * Add a Dir with Files and Subdirs to the archive
14.     *
15.     * @param string $location Real Location
16.     * @param string $name Name in Archive
17.     * @author Nicolas Heimann
18.     * @access private
19.     **/
20.
21.    public function addDir($location, $name) {
22.        $this->addEmptyDir($name);
23.
24.        $this->addDirDo($location, $name);
25.     } // EO addDir;
26.
27.    /**
28.     * Add Files & Dirs to archive.
29.     *
30.     * @param string $location Real Location
31.     * @param string $name Name in Archive
32.     * @author Nicolas Heimann
33.     * @access private
34.     **/
35.
36.    private function addDirDo($location, $name) {
37.        $name .= '/';
38.        $location .= '/';
39.
40.        // Read all Files in Dir
41.        $dir = opendir ($location);
42.        while ($file = readdir($dir))
43.        {
44.         if ($file == '.' || $file == '..') continue;
45.
46.            // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
47.            $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
48.            $this->$do($location . $file, $name . $file);
49.        }
50.    } // EO addDirDo();
51.}

        

Рассмотренные варианты наиболее удобны при копировании данных.


Александр Ермаков