我正在尝试编写一个小脚本,它将把表备份到夜间cron上的单独.SQL文件中。到目前为止,我有这个,而且效果很好:
db-backup.sh:
#!/bin/bash
DATABASES=$(mysql --defaults-extra-file=/root/.my.cnf -hlocalhost -uroot -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
for db in $DATABASES; do
DIR=/backup/mysql/$db
[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR
echo "Dumping tables into separate SQL command files for database '$db' into dir=$DIR"
tbl_count=0
for t in $(mysql --defaults-extra-file=/root/.my.cnf -uroot -D $db -NBA -e 'show tables')
do
echo "DUMPING TABLE: $db.$t"
mysqldump --defaults-extra-file=/root/.my.cnf -uroot $db $t | gzip > $DIR/$db.$t.sql.gz
tbl_count=$(( tbl_count + 1 ))
done
echo "$tbl_count tables dumped from database '$db' into dir=$DIR"
done这就像一种魅力,并将所有表备份到较小的文件中,进行压缩。我之所以要这样做,是因为有些表会改变,但很多表将保持不变(其中一些表是相当大的表- 10+gb)。
我正在试图找出我是否能做到,所以只有当MySQL转储在上次备份后发生了更改时,才会发生转储?
发布于 2021-02-03 14:16:57
好的,回答我自己的问题。我相信有更好的方法来做这件事,但这对我有用:
#!/bin/bash
DATABASES=$(mysql --defaults-extra-file=/root/.my.cnf -hlocalhost -uroot -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
for db in $DATABASES; do
if [[ "$db" != "performance_schema" && "$db" != "information_schema" && "$db" != "mysql" ]]; then
DIR=/backup/mysql/$db
[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR
echo "Dumping tables into separate SQL command files for database '$db' into dir=$DIR"
tbl_count=0
for t in $(mysql --defaults-extra-file=/root/.my.cnf -uroot -D $db -NBA -e 'show tables');
do
echo "DUMPING TABLE: $db.$t"
# detect which type of DB we are using - myISAM or Innodb
if test -f "/var/lib/mysql/$db/$t.MYI"; then
#echo "its myi"
last_modified=$(stat -c %y "/var/lib/mysql/$db/$t.MYI")
else
#echo "its ibd"
last_modified=$(stat -c %y "/var/lib/mysql/$db/$t.ibd")
fi
# see if we have a mod timestamp for this...
if test -f "$DIR/$t.mod"; then
value=$(<$DIR/$t.mod)
else
value=0
fi
echo " LAST MOD: $last_modified"
if [ "$value" != "$last_modified" ]; then
echo " Seems like this one has changed... '$value' != '$last_modified' ";
# make sure we update the modified timestamp
echo $last_modified > $DIR/$t.mod
# doing dump now...
mysqldump --defaults-extra-file=/root/.my.cnf --add-drop-table --routines -uroot $db $t | gzip > $DIR/$db.$t.sql.gz
# write down the tables that are changed...
tbl_count=$(( tbl_count + 1 ))
else
echo " Not changed since last dump on $last_modified"
fi
done
echo "$tbl_count tables dumped from database '$db' into dir=$DIR"
else
echo "SKIP DB: $db "
fi
done它将跳过performance_schema、information_schema和MySQL DB,因为我不关心这些。然后,在转储每个表后,它将为每个表设置一个.mod文件。然后在脚本下一次运行时读取它,如果从那以后它没有改变,它就不会麻烦地重新转储表了。它依赖于在MySQL中设置根/root/.my.cnf登录,如下所示:
[client]
password='xxxx'这意味着您可以使用脚本进行无密码操作(而不是在进程列表中显示)。
https://serverfault.com/questions/1052246
复制相似问题