بکاپ گیری از دیتابیس Mysql بوسیله PHP

سلام

امروز یک اسکریپت خیلی ساده و کوچیک درست کردم برای یکی از پروژه ها که مدیر سیستم بتونه از دیتابیس هر موقع لازم بود بکاپ بگیره

بعد از تست نهایی با کمی تغییر کد رو اینجا هم میزارم تا شاید به درد بخوره برای افرادی که نیاز دارن به این کار

ابتدا باید وصل بشیم به دیتابیس که فرض میکنیم Mysql هست

$host = "DBHOST";
$username = "DBUSERNAME";
$password = "DBPASSWORD";
$database_name = "DBNAME";
$conn = mysqli_connect($host, $username, $password, $database_name);
$conn->set_charset("utf8");

سپس یا دستور SHOW TABLES که بصورت یک QUERY ارسال میکنیم به دیتابیس ازش میخوایم که اسم همه table ها رو نشون بده و با استفاده از
یک حلقه while یک آرایه بوجود میارم از نام table ها

$tables = array();
$sql = "SHOW TABLES";
$result = mysqli_query($conn, $sql);

while ($row = mysqli_fetch_row($result)) {
    $tables[] = $row[0];
}

خب حالا باید توی تک تک اعضای این آرایه گردش کنیم و دیتای هر table رو بکشیم بریم

$sqlScript = "";
foreach ($tables as $table) {
    $query = "SHOW CREATE TABLE $table";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_row($result);
    
    $sqlScript .= "\n\n" . $row[1] . ";\n\n";
    
    
    $query = "SELECT * FROM $table";
    $result = mysqli_query($conn, $query);
    
    $columnCount = mysqli_num_fields($result);
    
    for ($i = 0; $i < $columnCount; $i ++) {
        while ($row = mysqli_fetch_row($result)) {
            $sqlScript .= "INSERT INTO $table VALUES(";
            for ($j = 0; $j < $columnCount; $j ++) {
                $row[$j] = $row[$j];
                
                if (isset($row[$j])) {
                    $sqlScript .= '"' . $row[$j] . '"';
                } else {
                    $sqlScript .= '""';
                }
                if ($j < ($columnCount - 1)) {
                    $sqlScript .= ',';
                }
            }
            $sqlScript .= ");\n";
        }
    }
    
    $sqlScript .= "\n"; 
}

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

if(!empty($sqlScript))
{
    $backup_file_name = $database_name . '_backup_' . time() . '.sql';
    $fileHandler = fopen($backup_file_name, 'w+');
    $number_of_lines = fwrite($fileHandler, $sqlScript);
    fclose($fileHandler); 

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($backup_file_name));
    ob_clean();
    flush();
    readfile($backup_file_name);
}

خب تموم شد . فقط این مورد رو بیاد داشته باشید که این برای بکاپ از دیتابیس های بزرگ زیاد جالب نیست و ممکنه با خطای کمبود memory مواجه بشید.
اگر دیتابیس شما خیلی بزرگ نیست میتونید در اول اسکریپ این مورد رو اضافه کنید

ini_set("memory_limit","2048M");

حالا یجای ۲۰۴۸ میتونید مقدار مد نظر خودتون رو وارد کنید
اگر دیتابیس شما خیلی بزرگ هست و دیتاهای چند هزار تایی یا محتوای خیلی زیادی داره بهتره از روش های دیگه استفاده کنید
مثلا از دستورات mysqladmin یا mysqldump.
اما برای دستابیس های کوچیک و متوسط روش خوبی هست

پیروز و سبز باشید

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *