Portál AbcLinuxu, 14. května 2025 01:39

Dotaz: Rada s vytvorenim skriptu (zalohovani SQL)

polo23 avatar 2.10.2010 14:20 polo23 | skóre: 28 | blog: polo23
Rada s vytvorenim skriptu (zalohovani SQL)
Přečteno: 328×
Odpovědět | Admin
Ahoj, potreboval bych poradit se skriptem ktery ma zalohovat MySQL. O co se jedna a jak to ma fungovat. Nejprve musim rict ze jsme zacatecnik co se tyka skriptovani. Mam nejake skolni zkusenosti s C ale ani v tomto jazyku jsme uz dlouho nedelal.

Mam za ukol udelat skript v Bash ktery zalohuje DB na serveru avsak s tim ze si nacte soubor ve kterem bude promenna ktera bude obsahovat seznam DB (vyjimek) ktere se zalohovat nemaji.

Ja ted resim skript od casti ktera je okomentovana slovem PROBLEM. O co jde... Zalohovani je udelano pomoci cyklu for ktery pro vsechny DB obsazene v promenne $databases udela zalohu (to je zjednodusene receno - ve skutecnosti se tam resi i ostatni moznosti jako vynechani zalohy pokud se oproti predchozi nezmenila atd.). To jede v poradku...
ALE problem nastal kdyz jsem dostal zadano ze si nactu seznam DB ktere se nemaji zalohovat. Kvuli tomu jsme tam pridal # VNITNI CYKLUS kterym jsem chtel osetrit tento problem tak ze vsechny databaze ktere mam zalohovat se porovnaji s databazemi ktere se maji vynechat a v pripade ze se rovnat nebudou tak zaloha probehne a z VNITNIHO CYKLU se vyskoci (do vnejsiho) To proto ze jinak by se znova porovnavalo a kdyz by se promenna v $database nerovnala tak by se zase zalohovala, tentokat uz podruhe - a tomu se potrebuju vyhnout. V pripade ze se rovnat bude vyskoci se rovnou (do vnejsiho cyklu) a to proto ze promenna v $database je rovna vyjimce (SKIP_MYSQL) a tudiz se nema zalohovat.
Problem je ze nevim jak to udelat...
V jazyce C bych promennou database porovnal se vsemi hodnotami SKIP_MYSQL (kterou bych mel vsak jako pole hodnot s indexy - to prave nevim jak v bash udelat) pokud by se rovnala alespon jedne z nich tak bych zalohovani preskocil jinak bych ji vykonal. Snad jsme napsal vse co je potreba k vyreseni problemu. Predem diky za kazdou radu.
#promenne
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
GREP=/bin/grep
DST_DIR=/var/backups/mysql
TMP_DIR=/tmp/sql

mkdir -p /var/backups/mysql   //adr. pro zalohu DB
mkdir -p /tmp/sql/            //adr. pro docasne ulozeni  DB

# includovat soubor s vyjimkami, vynechat pozadovane databaze, v souboru lnbackup_databases jsou databaze ktere se NEMAJI zalohovat, jsou v promenne SKIP_MYSQL

if [ -e /etc/default/lnbackup_databases ]; then 
  . /etc/default/lnbackup_databases
fi;  




#do promenne databases se ulozi databaze ktere jsou na serveru
databases=`$MYSQL -B -e 'show databases;' | $GREP -v '^Database'` 


#PROBLEM
for database in $databases;do           # VNEJSI CYKLUS
    for skip_database in $SKIP_MYSQL;do # VNITNI CYKLUS
        if [ "$database" != "$skip_database" ]; then  #pokracuj v programu a pak VYSKOC Z # VNITRNIHO CYKLU

            $MYSQLDUMP $database | grep -v 'Dump completed on ' | gzip --no-name > $TMP_DIR/$database.sql.gz 	#dump databaze 

            #zjistit zda existuje vubec nejaka predchozi zaloha - v pripade ze ano tak porovnavat, v pripade ze ne tak to tam rovnou nahrnout
            if [ -f $DST_DIR/$database.sql.gz ]; then
                echo "/usr/bin/diff -q $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz > /dev/null"
                ls -l  $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz
                if ! /usr/bin/diff -q $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz > /dev/null; then 
                echo "prepisuji soubor $DST_DIR/$database.sql.gz novejsi verzi"
                /usr/bin/diff $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz
                cp $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz			#prepis predchozi databazi
                else
                    rm $TMP_DIR/$database.sql.gz
                    echo "mazu $TMP_DIR/$database.sql.gz"
                fi
            else 
                mv  $TMP_DIR/$database.sql.gz $DST_DIR/$database.sql.gz
                echo "predchozi $DST_DIR/$database.sql.gz neexistovala, ukladam aktualni"
            fi
        else          
            echo "preskakuji zalohovani databaze $database"
            # VYSKOC Z VNITRNIHO CYKLU
            
        fi
     done

done
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.10.2010 14:54 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možná by šlo použít jenom vnější cyklus (ten, který prochází všechny databáze) a místo vnitřního použít grep na soubor s výjimkami - návratová hodnota grepu se IIRC liší podle toho, jestli se něco našlo.
Quando omni flunkus moritati
2.10.2010 20:57 NN
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proc tak komplikovane, kdyz si na zacatku muzes zjistit, ktere databaze se maji zalohovat predem:

cat $databases | sort > TMP1
cat $SKIP_SQL | sort > TMP2

diff TMP1 TMP2 > BACKUP_SQL; rm TMP1 TMP2
NN
2.10.2010 21:03 NN
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Sish co jsem to vyplodil,ale doufam ,ze chapes kam tim smeruju.. kdyz vis ktere se nemaji, vis ktere se maji..

NN
polo23 avatar 2.10.2010 22:41 polo23 | skóre: 28 | blog: polo23
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Diky za nasmerovani...zitra si to projdu:)
3.10.2010 00:34 NN
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Zase jsem se neco naucil:
#!/bin/sh
#
# GOOD:  1   BAD:   2
#        3          1
#        2
#        4
#

cat good | sort > TMP1
cat bad | sort > TMP2

SQL=`comm -23 TMP1 TMP2`

rm TMP1 TMP2

echo $SQL

exit 0
Tak a ted odzalohujes jen to co je potreba..

NN
polo23 avatar 7.10.2010 13:22 polo23 | skóre: 28 | blog: polo23
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Cau tak ted testuju co jsi sem upnul ale nefunguje to. Tvuj posldni prispevek v diskuzi nejak moc nechapu. Ja bych prave potreboval neco takoveho...

cat $databases | sort > TMP1
cat $SKIP_SQL | sort > TMP2

diff TMP1 TMP2 > BACKUP_SQL; rm TMP1 TMP2


...ale funkcniho.
7.10.2010 14:03 NN
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
Pouzi(man comm):
BACKUP_SQL=`comm -23 TMP1 TMP2`
To 2 potlaci vystup rozdilu v druhem souboru a 3 shody..

NN
polo23 avatar 7.10.2010 15:14 polo23 | skóre: 28 | blog: polo23
Rozbalit Rozbalit vše Re: Rada s vytvorenim skriptu (zalohovani SQL)
// kdyz jsem nepouzil sort tak byl vystup stejny
echo  $PROMENNA1 | sort > soubor.txt 
echo  $PROMENNA2 | sort > soubor1.txt 
BACKUP_SQL=`comm -23 soubor.txt soubor1.txt`


Vysledek je, ze zobrazi to co maji obe promenne spolecne. Ja naopak potrebuju prave rozdily. Nenapada me jak, ale slo by to nejak "negovat"?
//jen zopakuju ...mam promennou PROMENNA1 s databazema co se maji zalohovat a promennou PROMENNA2 ve ktere jsou databaze ktere se zalohovat nemaji. Takze pokud

PROMENNA1="alfa beta gama delta"
PROMENNA2="beta delta"

..tak vysledek bude ze se bude zalohovat pouze databaze "alfa" "gama". To alfa a gama bych chtel mit nejlepe taky v nejake promenne.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.