PDA

View Full Version : بک آپ گرفتن دیتابیس توسط کاربر



qqq2qqq
جمعه 25 فروردین 1391, 17:22 عصر
سلام می خواستم بدونم یا اینکه نظر شما رو بخوام این که بذارم کاربر از دیتابیش بک آپ بگیره که همیشه دیتابیش یه جا ذخیره بشه اگه به هر دلیلی حذفش کرد یا یک یا جند رکوردش رو حدف کرد؟
یعنی بدون اینکه تو cpanel بخوام ازش بک آپ بگیرم این امکان رو واسه کاربر بذارم ؟ اصلا تو وب این کار رو انجام میدن؟

armitakarimi
جمعه 25 فروردین 1391, 18:05 عصر
سلام

میتونی از همون کد پک آپ تو مای اس کیو ال استفاده کنی .

MMSHFE
جمعه 25 فروردین 1391, 18:59 عصر
این کد رو براتون نوشتم:


<?php
function backup_db($host, $user, $pass, $name, $tables = '*') {
date_default_timezone_set('Asia/Tehran');

$return = '';

mysql_connect($host,$user,$pass) or die('Connection error');
mysql_select_db($name) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');

if($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_free_result($result);
}
else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$result = mysql_query('SELECT * FROM `'.$table.'`');
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$return .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$return .= '\''.$row[$j].'\'';
}
else {
$return .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$return .= ',';
}
}
$return .= ');'.PHP_EOL;
}
}
$return .= PHP_EOL.PHP_EOL.PHP_EOL;
}

$handle = fopen('db-backup-'.$name.'-'.date('Y,m,d-H,i,s').'.sql', 'w');
fwrite($handle, $return);
fclose($handle);
}
?>

مثالی از نحوه فراخوانی تابع مذکور:

backup_db('localhost', 'root', '', 'your_db_name');
اگه سؤالی بود در خدمتم. موفق باشید.

qqq2qqq
شنبه 26 فروردین 1391, 15:24 عصر
به نظر شما اصلا این حالت رو بذارم که کاربر بخواد بک آپ بگیره؟

alonemm
شنبه 26 فروردین 1391, 17:08 عصر
باسلام:

برای امنیت بیشتر شما میتونید تابع مربوط به بکاب گیری رو در داخل یک فایل ذخیره کنید.

سپس توسط گزینه CornJobs در Cpanel این فایل و تابع مربوطه رو در یک بازه زمانی مثل هر شب ساعت 12 اجراش کنید.

qqq2qqq
شنبه 26 فروردین 1391, 23:05 عصر
بسیار پیشنهاد خوبی بود بسیار ممنون

qqq2qqq
یک شنبه 27 فروردین 1391, 00:06 صبح
backup_db('localhost', 'root', '', 'your_db_name');


این یه پارامترش کمه

MMSHFE
یک شنبه 27 فروردین 1391, 00:39 صبح
پارامتر آخر اختیاریه و اسم جدول رو میگیره و اگه چیزی ننویسید، همه جداول رو Backup میگیره. مثلاً اگه توی دیتابیستون برای هر کاربر یک جدول جداگانه ساختین، میتونید بهش اجازه پشتیبان گیری از جدول خودش رو فقط بدین.
موفق باشید.

qqq2qqq
یک شنبه 27 فروردین 1391, 23:03 عصر
جناب alonemm (http://barnamenevis.org/member.php?127814-alonemm) گفتن که تو قسمت Cron jobs می تونم فایلی رو برای اجرا زمانبندی کنم ، رفتم تو اون قسمت اما با دستور linux مثل اینکه باید بش بفهمونم!! ویزارد نیست
کسی می تونه کمکم منه

MMSHFE
یک شنبه 27 فروردین 1391, 23:23 عصر
توی اینترنت دنبال پارامترهای دستور wget بگردین.

qqq2qqq
دوشنبه 28 فروردین 1391, 22:58 عصر
دستور رو پیدا کردم احرا هم کردم فقط می خواستم بدونم آیا از نظر امنیت مشکلی پیدا نمی کنه واسم اینکه بک آپ دیتابیس تو یه فولدر ذخیره بشه؟!!!

MMSHFE
دوشنبه 28 فروردین 1391, 23:33 عصر
اگه پرمیشن اون پوشه رو تنظیم کنید مشکل خاصی پیش نمیاد. میتونید برای اطمینان بیشتر یک فایل htacces. هم توی اون پوشه بگذارین که دسترسی به محتویاتش رو ممنوع کنه. باز هم برای اطمینان بیشتر یک فایل index.php توی اون پوشه بگذارین که اگه اسم اون پوشه وارد شد، بجای نمایش فهرست محتویاتش، کاربر رو به صفحه اصلی سایت هدایت کنه.

qqq2qqq
سه شنبه 29 فروردین 1391, 00:37 صبح
چه پرمیژنی بذارم؟
و اینکه ممکنه فایل .htaccess رو کدش رو بذارین ایتجا که به جه صورت جیزی رو که گفتین انجام بدم؟

MMSHFE
سه شنبه 29 فروردین 1391, 07:35 صبح
داخل فایل htaccess. این کد رو بنویسید و توی پوشه ای که Backupها رو توش ذخیره کردین بگذارین:


Options -Indexes
Order allow, deny
deny from all

میتونید Permission رو هم روی 700 تنظیم کنید تا خودتون اجازه خوندن، ویرایش یا اجرای محتوای پوشه رو داشته باشین ولی سایر userهای اون هاست اشتراکی و یا کاربران عادی (بازدیدکنندگان) حق دسترسی نداشته باشن. درمورد Permission میتونید اینجا (http://www.tuxfiles.org/linuxhelp/filepermissions.html) رو برای اطلاعات بیشتر مطالعه کنید.
موفق باشید.

navid3d_69
دوشنبه 06 شهریور 1391, 20:42 عصر
می خوام کاری کنم که وقتی این کد اجرا شد همون فایل رو کاربر دانلود کنه یعنی بعد از بک آپ گرفتن اتومانیک برای کاربر دانلود بیاد می شه کمک کنین ممنون

MMSHFE
دوشنبه 06 شهریور 1391, 21:16 عصر
اینو امتحان کنید:


<?php
function backup_db($host, $user, $pass, $name, $tables = '*') {
date_default_timezone_set('Asia/Tehran');

$return = '';

mysql_connect($host,$user,$pass) or die('Connection error');
mysql_select_db($name) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');

if($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_free_result($result);
}
else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$result = mysql_query('SELECT * FROM `'.$table.'`');
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$return .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$return .= '\''.$row[$j].'\'';
}
else {
$return .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$return .= ',';
}
}
$return .= ');'.PHP_EOL;
}
}
$return .= PHP_EOL.PHP_EOL.PHP_EOL;
}

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="db-backup-' . $name . '-' . date('Y,m,d-H,i,s').'.sql"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.mb_strlen($return, 'utf-8'));
ob_clean();
flush();
echo $return;
}
?>

soroush.r70
سه شنبه 07 شهریور 1391, 10:05 صبح
حالا چطوری می شه مثلا هر یک ماه یک بار از دیتابیس بک آپ گرفته بشه و لینک دانلود برای مدیر سایت ظاهر بشه تا بک آپ رو دانلود و بعد دانلود فایل بک آپ قدیمی حذف بشه تا ماه بعد...؟

MMSHFE
سه شنبه 07 شهریور 1391, 15:20 عصر
دیگه این بستگی به هنر شما داره که با استفاده از Cron Jobs یا با کمک دیتابیس (ذخیره آخرین تاریخ Backup و مقایسه تاریخ جاری با اون و نمایش لینک دانلود در اولین بازدید بعد از گذشتن یک ماه از آخرین پشتیبانی گیری) اینکار رو انجام بدین.

imanitc
سه شنبه 07 شهریور 1391, 16:33 عصر
سلام من این تابع رو استفاده کردم خیلی عالی کار میکنه فقط تا انتهای جداول بک آپ نمیگیره نمیدونم مشکلم کجاس ؟
یعنی چند تا تیبل آخر و همچنین یه تیبل نصفه میگیره

soroush.r70
سه شنبه 07 شهریور 1391, 20:15 عصر
من اسکریپت برای بک آپ گیری و ارسال اون به ایمیل گیر اوردم می تونین یه توضیح در موردش بدین.


- - Start Script Here - -
<?php
$emailaddress = "XXXXXX@yourdomain.com";
$host="XXXXXX"; // database host
$dbuser="XXXXXX"; // database user name
$dbpswd="XXXXXX"; // database password
$mysqldb="XXXXXX"; // name of database
$path = "/full_server_path_to_file_goes_here"; // full server path to the directory where you want the backup files (no trailing slash)
// modify the above values to fit your environment
$filename = $path . "/backup" . date("d") . ".sql";
if ( file_exists($filename) ) unlink($filename);
system("mysqldump --user=$dbuser --password=$dbpswd --host=$host $mysqldb > $filename",$result);
$size = filesize($filename);
switch ($size) {
case ($size>=1048576): $size = round($size/1048576) . " MB"; break;
case ($size>=1024): $size = round($size/1024) . " KB"; break;
default: $size = $size . " bytes"; break;
}
$message = "The database backup for " . $mysqldb . " has been run.\n\n";
$message .= "The return code was: " . $result . "\n\n";
$message .= "The file path is: " . $filename . "\n\n";
$message .= "Size of the backup: " . $size . "\n\n";
$message .= "Server time of the backup: " . date(" F d h:ia") . "\n\n";
mail($emailaddress, "Database Backup Message" , $message, "From: Website <>");
?>
- - End Script Here -

MMSHFE
چهارشنبه 08 شهریور 1391, 19:47 عصر
سلام من این تابع رو استفاده کردم خیلی عالی کار میکنه فقط تا انتهای جداول بک آپ نمیگیره نمیدونم مشکلم کجاس ؟
یعنی چند تا تیبل آخر و همچنین یه تیبل نصفه میگیره
اگه میشه یک Export از دیتابیستون بگذارین تا تستش کنم.

MMSHFE
چهارشنبه 08 شهریور 1391, 20:03 عصر
من اسکریپت برای بک آپ گیری و ارسال اون به ایمیل گیر اوردم می تونین یه توضیح در موردش بدین.
این اسکریپت که انصافاً خیلی خوب و مرتب نوشته شده، با استفاده از فایل اجرایی خود MySQL یعنی mysqldump.exe که توی مسیر C:\wamp\bin\mysql\bin\mysqlX.X.XX\bin قرار داره (بجای X نسخه MySQL شما هست) از دیتابیس شما یک Backup تهیه میکنه و همون فایلی که ساخته میشه رو براتون میفرسته به ایمیلی که مشخص کردین. البته مطمئن نیستم روی هر دو هاست ویندوز و لینوکس بطور کامل کار کنه هرچند نوع پارامترهای mysqldump در ظاهر نشون میده که با ساختار لینوکس هم سازگاره. هرچند توی کدی که من نوشته بودم، سعی کردم از کوئریها برای استخراج اطلاعات استفاده کنم. فکر میکنم phpMyAdmin هم از روشی مشابه شیوه ای که من گفتم استفاده میکنه چون ساختار خروجی که میده، کمی فرق میکنه.
موفق باشید.

soroush.r70
پنج شنبه 09 شهریور 1391, 11:42 صبح
من اسکریپت برای بک آپ گیری و ارسال اون به ایمیل گیر اوردم می تونین یه توضیح در موردش بدین.


- - Start Script Here - -
<?php
$emailaddress = "XXXXXX@yourdomain.com";
$host="XXXXXX"; // database host
$dbuser="XXXXXX"; // database user name
$dbpswd="XXXXXX"; // database password
$mysqldb="XXXXXX"; // name of database
$path = "/full_server_path_to_file_goes_here"; // full server path to the directory where you want the backup files (no trailing slash)
// modify the above values to fit your environment
$filename = $path . "/backup" . date("d") . ".sql";
if ( file_exists($filename) ) unlink($filename);
system("mysqldump --user=$dbuser --password=$dbpswd --host=$host $mysqldb > $filename",$result);
$size = filesize($filename);
switch ($size) {
case ($size>=1048576): $size = round($size/1048576) . " MB"; break;
case ($size>=1024): $size = round($size/1024) . " KB"; break;
default: $size = $size . " bytes"; break;
}
$message = "The database backup for " . $mysqldb . " has been run.\n\n";
$message .= "The return code was: " . $result . "\n\n";
$message .= "The file path is: " . $filename . "\n\n";
$message .= "Size of the backup: " . $size . "\n\n";
$message .= "Server time of the backup: " . date(" F d h:ia") . "\n\n";
mail($emailaddress, "Database Backup Message" , $message, "From: Website <>");
?>
- - End Script Here -



می خواستم بدونم این اسکریپت هر چند وقت یک بار بک آپ می گیره و ارسال می کنه آبا می شه کاری کرد بک آپ های قدیمی رو از اون پوشه پس از ارسال پاک کنه....>

MMSHFE
جمعه 10 شهریور 1391, 09:22 صبح
این اسکریپت یکبار Backup میگیره. به انتهای کد فوق دستور زیر رو اضافه کنید:

unlink($filename);
اینطوری فایل Backup که ساخته شده بعد از ارسال، حذف میشه. البته باید کمی کد رو تغییر بدین تا بجای ارسال آدرس فایل، خود فایل ساخته شده رو به ایمیل بصورت ضمیمه (Attachment) اضافه کنه.

imanitc
شنبه 11 شهریور 1391, 10:10 صبح
اگه میشه یک Export از دیتابیستون بگذارین تا تستش کنم.
فکر کنم مشکل بخاطر اشتباه در محاسبه حجم فايل هست من اون خط که مربوط به حجم فايل ميشه رو غير فعال کردم مشکل رفع شد
با تشکر

navid3d_69
دوشنبه 27 شهریور 1391, 19:44 عصر
سلام من با این کد بک آپ میگیرم نمی تونم restore کنم ارور میده ولی با mysql که بک آپ میگیرم درست هست وقتی بکاپی کا با ین کد گرفته شده ریستور میشه این ارور رو میده




There seems to be an error in your SQL query. The MySQL server error output below, if there is any, may also help you in diagnosing the problem

ERROR: Unclosed quote @ 417
STR: '
SQL:

INSERT INTO `workshop` VALUES('1','“Lilian” studio/ workshop, begun its activity in fashion field in 2008, by publishing a DIY package on ladies outfit. Afterwards, the entire Lilian team attempt was to design and produce remarkable outfits with great materials for ladies. The future perspective for our studio/workshop is to increase the volume of production to a fair level alongside offering good quality.','استودیو/ کارگاه «لیلیان» فعالیت خود را در زمینه طراحی مُد ، در سال ۱۳۸۷ با چاپ یک بسته آموزشی در زمینه ل�

SQL query:

INSERT INTO `workshop` VALUES('1','“Lilian” studio/ workshop, begun its activity in fashion field in 2008, by publishing a DIY package on ladies outfit. Afterwards, the entire Lilian team attempt was to design and produce remarkable outfits with great materials for ladies. The future perspective for our studio/workshop is to increase the volume of production to a fair level alongside offering good quality.','استودیو/ کارگاه «لیلیان» فعالیت خود را در زمینه طراحی مُد ، در سال ۱۳۸۷ با چاپ یک بسته آموزشی در زمینه ل�

MySQL said:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''استودÛ ’Ùˆ/ کارگان¡ «لیلۊ’Ã' at line 1

soheilbehro
یک شنبه 11 خرداد 1393, 19:14 عصر
اینو امتحان کنید:


<?php
function backup_db($host, $user, $pass, $name, $tables = '*') {
date_default_timezone_set('Asia/Tehran');

$return = '';

mysql_connect($host,$user,$pass) or die('Connection error');
mysql_select_db($name) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');

if($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_free_result($result);
}
else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$result = mysql_query('SELECT * FROM `'.$table.'`');
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$return .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$return .= '\''.$row[$j].'\'';
}
else {
$return .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$return .= ',';
}
}
$return .= ');'.PHP_EOL;
}
}
$return .= PHP_EOL.PHP_EOL.PHP_EOL;
}

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="db-backup-' . $name . '-' . date('Y,m,d-H,i,s').'.sql"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.mb_strlen($return, 'utf-8'));
ob_clean();
flush();
echo $return;
}
?>


سلام

میدونم از زمان این پست خیلی گذشته ولی خیلی به این کد احتیاج دارم فقط یه مشکلی که با این کد دارم اینکه از همه ی بانک اطلاعاتی بک آپ نمیگیره و از نصفش بک آپ میگیره نمی دونم مشکل از حجم هستش یا جی؟

خوب الان یه چیز جدید فهمیدم اونم اینکه اگه دو سطر کد زیر رو حدف کنم درست کار می کنه
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');
ولی حالا دوباره مشکل اینجا پیش میاد که فارسی رو نمی تونه بخونه

lord_viper
دوشنبه 12 خرداد 1393, 08:17 صبح
چرا از دستور بکاپ خود mysql استفاده


"SELECT * FROM table_name INTO OUTFILE 'filepath.sql'"

table_name اسم جدولتون
filepath.sql ادرس فایلی که میخواهید بکاپ به اون نام ذخیره بشه

soheilbehro
سه شنبه 13 خرداد 1393, 10:09 صبح
چرا از دستور بکاپ خود mysql استفاده


"SELECT * FROM table_name INTO OUTFILE 'filepath.sql'"

table_name اسم جدولتون
filepath.sql ادرس فایلی که میخواهید بکاپ به اون نام ذخیره بشه

من می خوام از همه ی جدول هام بک آپ بگیرم

ممنون میشم کسی همون کد منو تصحیح کنه