首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >备份mySQL表,但只在上次备份后更改?

问备份mySQL表,但只在上次备份后更改?
EN

Server Fault用户
提问于 2021-02-03 11:13:56
回答 1查看 394关注 0票数 0

我正在尝试编写一个小脚本,它将把表备份到夜间cron上的单独.SQL文件中。到目前为止,我有这个,而且效果很好:

db-backup.sh:

代码语言:javascript
复制
#!/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转储在上次备份后发生了更改时,才会发生转储?

EN

回答 1

Server Fault用户

发布于 2021-02-03 14:16:57

好的,回答我自己的问题。我相信有更好的方法来做这件事,但这对我有用:

代码语言:javascript
复制
#!/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登录,如下所示:

代码语言:javascript
复制
[client]
password='xxxx'

这意味着您可以使用脚本进行无密码操作(而不是在进程列表中显示)。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1052246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档