Running with Ruby

Tag: cron

Backup (mysql dump) all your MySQL databases in separate files

Sometimes we would like to dump all the MySQL databases. MySQL provides an easy solution to this problem:

mysqldump -u root -p --all-databases > all_dbs.sql

However this will dump stuff into one file. How to dump all databses into separate files? Well, here is my solution. A small bash script:

#! /bin/bash

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/backup/$TIMESTAMP"
MYSQL_USER="backup"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/usr/bin/mysqldump

mkdir -p "$BACKUP_DIR/mysql"

databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"`

for db in $databases; do
  $MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done

Be aware, that in order to execute this script from cron, you need to store password in it (so cron won’t be prompted to provide a password). That’s why, you should not use a root account. Instead just create a new user only for backups, with following privileges:

  • SHOW DATABASES
  • SELECT
  • LOCK TABLES
  • RELOAD
  • SHOW VIEW

Uruchamianie zadań Rake z poziomu innych katalogów (nie z katalogu projektu)

Czasem potrzebujemy uruchomić zadanie Rake’owe niezależnie od katalogu w którym się znajdujemy. Powodem tego może być np potrzeba wrzucenia rake’owego taska do Crona, żeby odpalał się np. co 5 minut. Jak tego dokonać?

Pierwszą rzeczą jest dowiedzenie się gdzie leży Rake:

# Komenda:
which rake
# Wynik:
/usr/local/bin/rake

Jeśli z jakiegoś powodu nie mamy uprawnień do używania which, po prostu musimy strzelać. Jest duża szansa że rake będzie dokładnie tam, gdzie w powyższym przykładzie (chyba że korzystamy z RVM i nie jest to wersja –system).

Mając już rake’a, możemy przystąpić do działania. Załóżmy że chcemy odpalać go co 5 minut. W tym celu definiujemy następującą regułę:

*/5 * * * * env -i KOD_DO_ODPALENIA

Zagwarantuje nam to, że deamon systemowy, uruchomi nasz KOD_DO_ODPALENIA, co 5 minut. Następnie musimy dopisać kod który mamy uruchomić. Aby to zrobić, musimy powiązać przejście do katalogu aplikacji z odpaleniem jej. Robimy to operatorem &&. Najpierw mówimy deamonowi gdzie chcemy być:

cd /home/nazwa_konta/rails/apka/

następnie co chcemy uruchomić i w jakim środowisku:

/usr/local/bin/rake cron:all  RAILS_ENV=production

i łączymy to w jedną regułę:

*/5 * * * * env -i cd /home/nazwa_konta/rails/apka/ &&  /usr/local/bin/rake cron:all  RAILS_ENV=production

jeśli tamto nie zadziała, można w ten sposób:

*/5 * * * * env -i bash -c 'cd /home/nazwa_konta/rails/apka/; /usr/local/bin/rake cron:all RAILS_ENV=production'

Wersja dla Crona który nie ma tych samych zmiennych środowiskowych co shell:

 */5 * * * * source $HOME/.serv && cd /home/nazwa_konta/rails/apka && rake cron:all RAILS_ENV=production

Copyright © 2018 Running with Ruby

Theme by Anders NorenUp ↑