如何将本地MySQL数据库镜像到在线(实时)MySQL?

时间:2011-09-03 07:52:30

标签: php mysql

我是个菜鸟,有人可以帮我吗?

我有一个使用Xampp通过phpMyAdmin的本地SQL数据库,我想在我的网站上将它镜像到在线MySQL。

当我对本地数据库进行更改时,我希望我的在线数据库更新(实时)并进行更改。

这可能吗?我可以有一个示例PHP代码或任何可以做到这一点?谢谢!!

2 个答案:

答案 0 :(得分:1)

很多时候我为这个问题编写了一些脚本。如上所述 - 复制它是非常好的解决方案,但在我的情况下,我无法使用它。所以..如果你需要像master-> slave这样的复制,也许这个脚本将是useffull:

dumps.sh : 
while getopts "c:l:" opt; do
        case $opt in
                c)
                if [ -r "$OPTARG" ]; then
                                source "$OPTARG"
                        else
                                echo "Unreadable config file \"$OPTARG\""
                                exit 1
                        fi
                        ;;
                l) LOG_FILE="$OPTARG"
                        if [ ! -f "$LOG_FILE" ]; then
                                `touch $LOG_FILE`
                        fi
                        ;;
                \?) echo "Invalid options. -$OPTARG. USE -c config_file"
                        exit 1
                        ;;
                 :) "Option -$OPTARG requires an argument."
                        ;;
        esac
done

logIt()
{
        date_now=`date '+%D %T'`
        if [ $LOG_FILE != "" ]; then
                echo "$date_now : $*" >> $LOG_FILE
        else
                echo "$date_now : $*"
        fi
}

build_tables()
{
        TAB=""
        logIt $@
        for table in $TABLES
        do
                TAB="$TAB ${1}${table}"
        done
        echo $TAB
}
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
RM="$(which rm)"
DEST="."

MBD="$DEST/mysql"
eval $RM -fv "$MBD/*"
FILE=""

[ ! -d $MBD ] && mkdir -p $MBD || :

$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

TAB=`build_tables $DB_PREFIX`

FILE="$MBD/$DB_NAME.sql";
($MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $DB_NAME $TAB  2>> $LOG_FILE) > $FILE


input_to_mysql()
{
        ###############################3
        CP="$(which cp)"
        SED="$(which sed)"
        len=${#INSERT_DB_NAME[*]}
        i=0

        while [ $i -lt $len ]; do
                NEW_FILE="$MBD/${INSERT_DB_NAME[$i]}.sql"
                eval $CP $FILE $NEW_FILE
                eval $SED -i "s/$DB_PREFIX/${INSERT_DB_PREFIX[$i]}/g" $NEW_FILE
                eval $SED -i "s/^.\*!.*$//g" $NEW_FILE
                let i++
        done
        i=0
        while [ $i -lt $len ]; do
                NAME="$MBD/${INSERT_DB_NAME[$i]}.sql"
                if [ -e $NAME ]; then
                                $MYSQL -u${INSERT_DB_USER[$i]} -p${INSERT_DB_PASS[$i]} -h${INSERT_DB_HOST[$i]} ${INSERT_DB_NAME[$i]} < $NAME 2>> $LOG_FILE
                                #echo "$MYSQL -u${INSERT_DB_USER[$i]} -p${INSERT_DB_PASS[$i]} -h${INSERT_DB_HOST[$i]} ${INSERT_DB_NAME[$i]} < $NAME"
                                logIt "IMPORT TO ${INSERT_DB_NAME[$i]}"
                else
                        logIt "File $NAME not exist";
                fi
                let i++
        done
}

check_dump()
{
        FILE_TMP_DUMP="$MBD/tmp_dump_${INSERT_DB_NAME[0]}.sql";
        FILE_DIFF_RESS="$MBD/diff_res.diff"
        tmp_tables=`build_tables ${INSERT_DB_PREFIX[0]}`
        ($MYSQLDUMP -u ${INSERT_DB_USER[0]} -h ${INSERT_DB_HOST[0]} -p${INSERT_DB_PASS[0]} ${INSERT_DB_NAME[0]} $tmp_tables 2>>$LOG_FILE) > $FILE_TMP_DUMP
        DIFF="$(which diff)"
        $DIFF $FILE $FILE_TMP_DUMP > FILE_DIFF_RESS
        [ -s "$SMB/diff_res.diff" ];
        SUCCESS=$?
        eval $RM -f $FILE_TMP_DUMP $FILE_DIFF_RESS
        return $SUCCESS
}

if check_dump; then
        input_to_mysql
else
        logIt "No need to dump"
fi

所以像dump.sh -c config -l log.file

一样运行

这样的配置:

MyHOST="master_host"
MyUSER="master_user"
MyPASS="master_password"
DB_NAME="master_db_name"
DB_PREFIX="master_db_prefix_" # leave empty if you haven't table prefix

TABLES="table1 table2 table3" // list of tables - leave empty for all tables


###############################
INSERT_DB_NAME=(slave_dbname1 slave_dbname2)
INSERT_DB_HOST=(slave_host1 slave_host2)
INSERT_DB_USER=(slave_user1 slave_user2)
INSERT_DB_PASS=(slave_pass1 slave_pass2)
INSERT_DB_PREFIX=(slave_db_prefix1 slave_db_prefix1) //

我把它推到了cron,一切都适合我。 当然你可以手动完成所有这些......

答案 1 :(得分:0)

您要找的字是Replication。这不是实时,而是差不多。