===== Beispiel für ein rsync Skript ===== Aufgabe: Mit gzip gezippte Archive vom Altsystem auf die neue Produktion kopieren, für jeden Kopiervorgang wird der Namen des aktuellen Backup Verzeichnis als Startparameter übergeben. Ablauf: * Kopieren per rsync * Entpacken per gzip * Prüfen ob auf der lokalen und der Remote Seite die gleiche Anzahl der Dateien vorliegt * Setzen der Rechte auf den Oracle User Vorbereitung: * SSH Key Austausch zwischen den Server für den Kopier User (z.B. root) siehe [[windows:putty_pscp_ssh_key_connect#ssh_key_s_bzw_ssh_key_struktur_auf_dem_linux_system_erzeugen|Putty mit SSH Key's verwenden - Abschnitt ssh key Austausch]] === Infos === Man Page Rsync: http://linux.die.net/man/1/rsync === Das Script === #!/bin/sh # # Script to start rsnc to copy archivelogs from old 9i enviroment to new prod # # crontab example # Minute Hour Day of Month Month Day of Week Command # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) #30 16 12 2 * /backup/scripts/copy_pro_backup_archives.sh COPYTEST ########## Enviroment ############## DAY_OF_WEEK=`date +%w` export DAY_OF_WEEK DAY=`date +"%m_%d_%y_%H_%M"` export DAY ############################## # Home of the scrips SCRIPTPATH=$(cd ${0%/*} && echo $PWD/${0##*/}) SCRIPTS_DIR=`dirname "$SCRIPTPATH{}"` ############################## #logfile LOG=${SCRIPTS_DIR}/run_copy_job_${DAY}.log ############################## # Parameter DIRECTORY_NAME=$1 REMOTE_SERVER=gpi019i.pipperr.local REMOTE_DIR=/backup REMOTE_USER=oracle LOCAL_DIR=/backup LOCAL_HOST=`hostname` LOCAL_ORA_USER=oracle LOCAL_ORA_GROUP=oinstall ############################## ############################## echo ------------- START JOB at "`date`" ---- -------------- > "${LOG}" 2>&1 echo -- >> "${LOG}" 2>&1 echo -- Info Parameter :: REMOTE_SERVER =${REMOTE_SERVER} >> "${LOG}" 2>&1 echo -- Info Parameter :: REMOTE_DIR =${REMOTE_DIR} >> "${LOG}" 2>&1 echo -- Info Parameter :: LOCAL_HOST =${LOCAL_HOST} >> "${LOG}" 2>&1 echo -- Info Parameter :: LOCAL_DIR =${LOCAL_DIR} >> "${LOG}" 2>&1 echo -- Info Parameter :: DIRECTORY_NAME=${DIRECTORY_NAME} >> "${LOG}" 2>&1 echo -- Info : Start rsync >> "${LOG}" 2>&1 # get lock to prevent multiple runs # set ${LOCKFILE} ! LOCKFILE=${SCRIPTS_DIR}/lock exec 100>${LOCKFILE}_runStat; if flock -n -x 100; then echo "-- Info -- start the script in ${SCRIPTS_DIR}" >> "${LOG}" 2>&1 else echo "Error -- Script is still running!" >> "${LOG}" 2>&1 exit 1 fi if [ ! -n "${DIRECTORY_NAME}" ]; then echo "Error -- Parameter 1 - the directory name is empty" >> "${LOG}" 2>&1 echo "Error -- Parameter 1 - the directory name is empty" exit 1 fi ### copy the directory from the remote host ot the localhost # watch the trailing / of the local directory! # rsync Options z compress (only for not compressed files!) # h show human readable numbers # a is -rlptgoD - archive setting to preserver the most features # # /usr/bin/rsync -ahv ${REMOTE_USER}@${REMOTE_SERVER}:${REMOTE_DIR}/${DIRECTORY_NAME} ${LOCAL_DIR}/ >> "${LOG}" 2>&1 # echo ---------------------------------------------------- >> "${LOG}" 2>&1 ### unzip all files in the directory echo -- Info : Start unzip at "`date`" >> "${LOG}" 2>&1 # gzip -df ${LOCAL_DIR}/${DIRECTORY_NAME}/*.gz >> "${LOG}" 2>&1 ## check if all is transferd LOCAL_GET_COUNT=`ls -la ${LOCAL_DIR}/${DIRECTORY_NAME}/*.arc | wc -l` echo ---------------------------------------------------- >> "${LOG}" 2>&1 echo -- Info : found local files :: ${LOCAL_GET_COUNT} >> "${LOG}" 2>&1 REMOTE_GET_COUNT=`ssh ${REMOTE_SERVER} "ls -la ${REMOTE_DIR}/${DIRECTORY_NAME}/*.*" | wc -l` echo -- Info : found REMOTE files :: ${REMOTE_GET_COUNT} >> "${LOG}" 2>&1 echo ---------------------------------------------------- >> "${LOG}" 2>&1 echo -- Info set the user rights >> "${LOG}" 2>&1 ## set the rights of the directory ot the DB User # chown -R ${LOCAL_ORA_USER}:${LOCAL_ORA_GROUP} ${LOCAL_DIR}/${DIRECTORY_NAME} # ############## Log file handling # # zip all log files older then 3 days for i in `/usr/bin/find ${SCRIPTS_DIR} -ctime +72 | /bin/grep -i "\.log"` do /bin/gzip -9 $i >> "${LOG}" 2>&1 done # delete all log files older then 14 days for i in `/usr/bin/find ${SCRIPTS_DIR} -ctime +336 | /bin/grep -i "\log.gz"` do rm $i >> "${LOG}" 2>&1 done echo ------------- FINISH JOB at "`date`" ---- -------------- >> "${LOG}" 2>&1 ==== Mögliche Fehler Quelle ==== **Fehler:** protocol version mismatch -- is your shell clean? (see the rsync man page for an explanation) rsync error: protocol incompatibility (code 2) at compat.c(64) [sender=2.6.8] **Lösung:** Auf dem Remote Server wurde in der .bashrc eine .profile aufgerufen, die mit echo Text ausgibt, dieser Text "zerstört" dann den Aufbau des rsync Protokolls. Dieser auskommentiert damit keine Ausgaben bei einem Login erzeugt werden. Interessanterweise hat ein SSH Banner nicht den gleichen Effekt, das nervtötende Pseudo-Sicherheits-SSH Banner in dieser Umgebung konnte übersprungen werden.