Note, that this recipe is not updated long time and could be outdated!
Got it.

MySQL datubāzes kopēšana

Must prepare before:  MySQL datubāze

Rezerves kopēšana failu līmenī datu bāzes failiem ir nedroša, jo faila kopēšanas brīdi datu bāze var tikt modificēta, un kopētais fails var saturēt nesaskaņotus datus. Tāpēc datu bāzu kopijas jāveido ar datu bāzes līdzekļiem.

Ar šo skriptu tiek veikta regulāra pilna datu bāzu kopēšana izmantojot mysqldump komandu. mysqldump izveido sql skriptu, kas apraksta datu bāzi, kuru izpildot tiek izveidoti visi datu bāzes objekti un tabulas tiek uzpildītas ar vajadzīgajiem datiem.

Datu bāzes kopijas izveide

Datu bāzes kopiju izveido ar komandrindu:

mysqldump -uroot -ppassword xwiki > xwiki.sql

Atkarībā no servera iestatījumiem, var nākties norādīt tukšu opciju komandu, piemēram, sekojoši

mysqldump -uroot -ppassword --opt database > database.sql
  1. Ja komandu izmanto dialogrežīmā, paroli var ievadīt atsevišķi, norādot tikai slēdzi -p bez paroles.
  2. Lai izmetes failā iekļautu saglabātās procedūras, pievieno slēdzi --routines
  3. Lai neiekļautu tabulu datus, pievieno slēdzi --no-data.

Rezerves kopijas izveides ieplānošana

  1. Mapē /home/bin izveido failu mysql_backup.
  2. Failā ieraksta sekojošu saturu:

    #!/bin/bash
    user="root"
    password="password"
    backup_dir="/home/backup"
    prefix="mysql"

    # List of databases, delimited by spaces
    DBS="jtrac xwiki"

    # sleep for random time to minimize load on server farms
    max=1800
    seconds=$RANDOM
    let "seconds %= $max"
    sleep $seconds

    if [[ ! -d $backup_dir ]]; then
      mkdir $backup_dir
    fi

    cd $backup_dir
    find $backup_dir/ -name "$prefix.**.tgz" -mtime +7 | xargs rm -f

    printf "**** MySQL backup   ****\t\tstarted\t\t`date`\n">>log
    for cdb in $DBS
    do
      printf "  - MySQL backup for $cdb  -\t\t\t`date`\n">>log
      mysqldump -u$user -p"$password" $cdb > $backup_dir/$prefix.$cdb.sql 2>>err_log
    done
    printf "**** MySQL backup   ****\t\t finished\t`date`\n">>log
    tar -zcvf $prefix.`date -I`.tgz $prefix.**.sql
    rm $prefix.**.sql
  3. Padara failu izpildāmu, un, tā kā failā ir norādīta root parole, nodrošināmies, ka citi šī faila saturu nevar redzēt:

    chown root:root mysql_backup
    chmod 770 mysql_backup
  4. Pēc noklusēšanas MySQL datubāzes faili atrodas /var/lib/mysql mapē kur katrai bāzei ir savs apakšmape.
    Ja datu bāzu apjoms kļūst liels, šo apakšmapi kopēšanu failu līmenī var izslēgt norādot papildus parametru -P var/lib/mysql/xwiki ... u.t.t. dar komandai dar_home_full un dar_home_diff skriptos.
  5. Ieplāno MySQL datu bāzu kopēšanu. "Tīrā" komandrindas logā kā root ievada komandu:

    crontab -e
  6. Esošās rindas papildina ar parauga pēdējo rindu (veidot kopiju katru dienu plkst. 22):

    # m h  dom mon dow   command
    0 2 * * *   /home/bin/mysql_backup
  7. Saglabā plānotāja uzdevumus ar komandām Ctrl+o Enter un +Ctrl+x
  8. Pārliecinās, ka plānotājs uzdevumi ir ierakstīti ar komandu:

    crontab -l

    Rezerves kopēšanas skriptu statuss tiek rakstīts tajos pašos žurnāla failos, kur failu sistēmas kopēšanai: /home/backup/log un /home/backup/err_log.

Datu atjaunošana

  1. Atarhivē bāzes skripta arhīvu

    tar -xvzf db_2007-11-12.tgz
  2. Atjauno datus uz vajadzīgo bāzi. Var rakstīt pa virsu esošajai bāzei, jo bāzes esošie objekti tiek izdzēsti un veidoti no jauna.

    mysql -uroot -ppassword xwiki < xwiki.sql

Kļūdu novēršana

  1. Ja ielasot datus parādās kļūda:

    ERROR 1153 (08S01) at line 484: Got a packet bigger than 'max_allowed_packet' bytes
  2. Failā /etc/mysql/my.cnf izmaina rindas:

    ...
    [mysqld]
    ...
    max_allowed_packet = 512M
    ...
    [mysqldump]
    ...
    max_allowed_packet = 512M
    ...

Saites

http://www.linuxforum.com/content.php/147-Backup-all-databases-nightly-w-mysqldump


  
Tags Linux Datubāze Kopēšana Atjaunošana
Created by Valdis Vītoliņš on 2008-08-08 10:38
Last modified by Valdis Vītoliņš on 2021-04-13 14:30
 
Xwiki Powered
Creative Commons Attribution 3.0 Unported License