복붙노트

MySQL 데이터의 자동화 된 또는 정기적 인 백업

PHP

MySQL 데이터의 자동화 된 또는 정기적 인 백업

나는 데이터베이스의 일부 테이블을 / plain php / 나의 두 번째로 좋아하는 언어를 사용하여 정기적으로 백업하려고한다. 나는 자동화가되어 나중에 뭔가 잘못되었을 때 백업을 복구 할 수 있기를 바랍니다.

쿼리를 실행하고 결과를 파일에 저장하려고했습니다. 이런 식으로 보이는 코드로 마무리되었습니다.

$sql = 'SELECT * FROM my_table ORDER id DESC';
$result = mysqli_query( $connect, $sql );  
if( mysqli_num_rows( $result ) > 0){

    $output=fopen('/tmp/dumpfile.csv','w+');

    /* loop through recordset and add that to the file */
    while( $row = mysqli_fetch_array( $result ) ) {
        fputcsv( $output, $row, ',', '"');
    }

    fclose( $output );
}

내 로컬 컴퓨터에서이 코드로 웹 페이지를 치기 위해 크론 작업을 설정했다. 나는 또한 cronjob을 서버에 작성하여 CLI로 스크립트를 실행하려고 시도했다. 그러나 그것은 모든 종류의 문제를 야기하고 있습니다. 여기에는 다음이 포함됩니다

mysqldump에 대해서도 들었다. 나는 exec로 실행하려고했지만 오류가 발생합니다.

이 문제를 어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.http://dev.mysql.com/doc/refman/5.7/en/select-into.html

    http://dev.mysql.com/doc/refman/5.7/en/select-into.html

    다음은 완전한 예입니다.

    SELECT * FROM my_table INTO OUTFILE '/tmp/my_table.csv'
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      FROM test_table;
    

    파일은 서버에 저장되며 선택한 경로는 쓰기 가능해야합니다. 이 쿼리는 PHP와 웹 요청을 통해 실행될 수 있지만, mysql 콘솔을 통해 실행하는 것이 가장 좋습니다.

    이 방식으로 내보내는 데이터는 LOAD DATA INFILE을 사용하여 다른 데이터베이스로 가져올 수 있습니다

    이 방법은 결과 집합을 통해 반복적으로 행마다 파일에 저장하는 것이지만 사용하는 것만 큼 좋지는 않습니다.

    mysqldump는 SELECT INTO OUTFILE보다 여러면에서 우월합니다. CSV를 생성하는 것은이 명령이 할 수있는 많은 것들 중 하나 일뿐입니다.

    이상적으로 mysqldump는 쉘에서 호출되어야한다. PHP에서 exec를 사용하여 실행할 수도 있지만 덤프를 생성하는 데 데이터 양에 따라 시간이 오래 걸릴 수 있으며 PHP 스크립트는 보통 30 초 동안 만 실행되므로 백그라운드 프로세스로 실행해야합니다.

    mysqldump는 문제가 없다.

    고전적인 예제는이 질문을 참조하십시오 : 파이썬을 사용하는 MySQL 백업에서의 서버 충돌. 이전 mysqldump가 완료되기 전에 시작되어 웹 사이트가 완전히 응답하지 않는 것처럼 보이는 곳.

    따라서 복제는 SELECT INTO OUTFILE 또는 msyqldump와 다르게 작동합니다. 데이터를 로컬 복사본에 보관하는 것이 이상적입니다 (완벽하게 동기화되었지만 슬레이브 지연이라고하는 것이 있습니다). 반면에 예약 된 작업을 사용하여 mysqldump를 실행하는 경우 24 시간마다 한 번. 23 시간이 지난 후에 서버가 충돌하면 어떻게 될지 상상해보십시오.

    mysqldump를 실행할 때마다 많은 양의 데이터를 만들어 내고 정기적으로 작업을 계속하면 하드 디스크가 가득 차거나 파일 저장 법안이 지붕에 부딪치게됩니다. 복제만으로 변경 사항이 서버로 전달됩니다 (소위 binlog를 사용하여)

    복제의 대안은 Percona XtraBackup을 사용하는 것입니다.

    Percona에서는 Mysql 및 Mariadb와 호환됩니다. mysqldump의 가장 큰 한계점 인 증분 백업을 수행 할 능력이 있습니다.

  2. ==============================

    2.PHP 스크립트 대신 스크립트 파일을 사용하여 명령 줄 유틸리티로 데이터베이스 백업을 얻으라고 제안합니다.

    PHP 스크립트 대신 스크립트 파일을 사용하여 명령 줄 유틸리티로 데이터베이스 백업을 얻으라고 제안합니다.

    저장소 구성을 위해 my.ini 파일 만들기

    사용자의 루트 디렉토리에있는 기본 db 사용자 이름과 암호에 대해 my.ini 파일을 만듭니다. 그래서 스크립트는이 파일에서 사용자 이름, 암호 및 호스트 이름을 사용합니다.

    [client]
    user = <db_user_name>
    password = <db_password>
    host = <db_host>
    

    backup.sh라는 sh 파일 만들기

    #!/bin/sh
    #
    # script for get backup everyday
    
    #change directory to your backup directory
    cd /path_of_your_directory
    #get backup of database of applications
    mysqldump <your_database_name> tmp_db.sql;
    
    #compress it in zip file
    zip app_database-$(date +%Y-%m-%d).sql.zip tmp_db.sql;
    
    #remove  sql file
    rm -rf tmp_db.sql;
    

    sh.file에 실행 파일 권한을 부여하십시오.

    chmod +x backup.sh
    

    세트 Cronjob

    sh /<script_path>/backup.sh >/dev/null 2>&1
    

    그게 다야

    행운을 빕니다

  3. from https://stackoverflow.com/questions/38916163/automated-or-regular-backup-of-mysql-data by cc-by-sa and MIT license