Database là nơi chứa nội dung của ứng dụng, web.. và tần xuất update cũng cao. Vì vậy việc thường xuyên backup database sẽ tránh được những trường hợp mất dữ liệu đáng tiếc.
Script bên dưới sẽ backup từng database, lưu ra từng file với tên file có kèm phần hậu tố là thời gian tạo file để thứ tự năm tháng ngày sẽ dể sort khi kiếm hơn.
Thêm giờ phút giây để tránh bị trùng tên nếu backup nhiều lần trong ngày.
File backup sẽ được nén lại, vì việc nén file text giúp tiết kiệm rất nhiều không gian lưu trữ.
Trong script bên dưới có một phần là optional, trường hợp chúng ta không muốn backup thông tin 3 database của bản thân mysql.
Mỗi dòng đều có comments vì vậy mình không giải thích thêm.
Step 1: Tạo file backup như bên dưới
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/bin/bash # set location to save backup BACKUP_DIR="/backup/database/" # get datetime to suffix backup file DATE=$(date +"%Y%m%d-%H%m%S") # set file perm, only owner can read, write file umask 177 # command backup MYSQLDUMP=`which mysqldump` MYSQL=`which mysql` # get all database exclude: mysql, information_schema, performance_schema (optional) SQL_QUERY="SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE" SQL_QUERY="$SQL_QUERY SCHEMA_NAME NOT IN ('mysql', 'information_schema', 'performance_schema')" # save list database to tmp file TMPLISTDATABASE='/tmp/tmplistdatabase' # Option -N for not override table to file $MYSQL -Ne "$SQL_QUERY" > $TMPLISTDATABASE # count all database will backup ALL_DATABASE=`wc -l ${TMPLISTDATABASE} | cut -d" " -f1` # set backup option BACKUP_OPTIONS='--routines --triggers --single-transaction' echo "All database will backup is $ALL_DATABASE" I=0 for DB in `cat ${TMPLISTDATABASE}` do I=$(($I+1)) $MYSQLDUMP $BACKUPOPTION ${DB} | gzip > $BACKUP_DIR/${DB}-$DATE.sql.gz echo "$I/$ALL_DATABASE - Backup done for database ${DB}" done |
Sau khi tạo xong file này thì lưu nó vào một nơi khác với nơi sẽ lưu file backup, vì chúng ta sẽ lập lịch xóa file cũ.
Notes: Mình không khai báo thông tin kết nối trong file này vì nó nên nằm trong /user/.my.cnf
Tránh việc chia sẻ file hoặc lưu ở những nơi public sẽ làm leak password.
Step 2: Viết file bash xóa dữ liệu cũ hơn 15 ngày.
1 |
find /backup/database -mtime +15 -exec rm -rf {} \; |
Note: Có thể để command xóa này ở cuối cùng của file backup luôn để sau khi backup xong, nó kiểm tra và xóa file luôn.
Step 3: Tạo crontab backup và xóa file
Vào editor soạn thảo crontab (root là tên user)
1 |
crontab -e -u root |
Database backup mỗi ngày 2 lần vào 12h trưa và 12h đêm, cần chmod u+x /root/scripts/backup_mysql.sh để đảm bảo file có quyền thực thi. Xuất log nếu có lỗi để có thể kiểm tra lại.
1 |
0 0,12 * * * /root/scripts/backup_mysql.sh 2>backup_mysql_error.log |
Xóa file check vào mỗi 12h đêm.
cần chmod u+x /root/scripts/remove_old_dbbackup.sql để đảm bảo file có quyền thực thi. Xuất log nếu có lỗi để có thể kiểm tra lại.
1 |
0 0 * * * /root/scripts/remove_old_dbbackup.sql 2> remove_old_dbbackup_error.log |
The End!