Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

स्थानीय MySQL डेटाबेस को ऑनलाइन (रीयलटाइम) MySQL में कैसे मिरर करें?

कई बार मैंने इस समस्या के लिए कुछ स्क्रिप्ट लिखी थी। जैसा कि ऊपर कहा गया है - प्रतिकृति यह वास्तव में अच्छा समाधान है लेकिन मेरे मामले में मैं इसका उपयोग नहीं कर सका। तो .. अगर आपको मास्टर-> दास द्वारा प्रतिकृति की तरह कुछ चाहिए तो शायद यह स्क्रिप्ट उपयोगी होगी:

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 [email protected]
        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

इसलिए डंप.श-सी कॉन्फिग -एल लॉग.फाइल की तरह चलाएं

जहां इस तरह कॉन्फिगर करें:

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) //

मैंने इसे क्रॉन पर रखा और मेरे लिए सब ठीक काम करता है। बेशक आप यह सब मैन्युअल रूप से कर सकते हैं ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL तालिकाओं में स्लैश, लेकिन PDO और पैरामीटरयुक्त प्रश्नों का उपयोग करना। क्या हो रहा है?

  2. MySQL में डेटाटाइम वैल्यू में समय कैसे जोड़ें

  3. MySQL में इंटेंट लॉक्स डालने का समाधान

  4. अशक्त पंक्तियों के लिए पिछला मान प्राप्त करें

  5. चेतावनी:mysqli_connect ():(HY000/2002):ऐसी कोई फ़ाइल या निर्देशिका नहीं