#!/bin/sh

DBFILE=./migratedata2redis.sql

for((nDBIndex=0;nDBIndex<4;nDBIndex++))
do

if [ -f $DBFILE ]
then
rm -rf $DBFILE
fi
for((nTBIndex=0;nTBIndex<64;nTBIndex++))
do
(
cat <<EOF
SELECT concat(
'*4\r\n\$4\r\nzadd\r\n',
'\$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'\$', LENGTH(redis_score), '\r\n',
redis_score, '\r\n',
'\$', LENGTH(redis_value), '\r\n',
redis_value, '\r'
)
FROM(
select FtoID ,FmsgID,FdbIndex,FtableIndex,FmsgTimestamp,
concat("offlinemsg_",FtoID) as redis_key,
FmsgTimestamp as redis_score,
concat(FmsgID,"_", FdbIndex,"_", FtableIndex) as redis_value
from db_im_user_msg_$nDBIndex.t_im_user_msgidlist_$nTBIndex
)
AS T;
EOF
) >> $DBFILE
done
echo "begin migrate data to redis,use $DBFILE .."
mysql db_im_user_msg_$nDBIndex --skip-column-names --raw < $DBFILE | redis-cli --pipe
echo "migrate data to redis,end"
done這個(gè)腳本是將以多庫多表存儲(chǔ)在MYSQL的數(shù)據(jù)遷移到REDIS的一個(gè)庫里。 但是假如,需求是將這些數(shù)據(jù)安全UID的規(guī)則遷移到REDIS的不同的庫里呢,怎么辦?
#!/bin/sh

DBFILE=./migratedata2redis.sql

function select_data()
{
DBINDEX=$1
TBINDEX=$2
MOINDEX=$3
#echo "select_data $DBINDEX $TBINDEX $MOINDEX"

(
cat <<EOF
SELECT concat(
'*4\r\n\$4\r\nzadd\r\n',
'\$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'\$', LENGTH(redis_score), '\r\n',
redis_score, '\r\n',
'\$', LENGTH(redis_value), '\r\n',
redis_value, '\r'
)
FROM(
select FtoID ,FmsgID,FdbIndex,FtableIndex,FmsgTimestamp,
concat("offlinemsg_",FtoID) as redis_key,
FmsgTimestamp as redis_score,
concat(FmsgID) as redis_value
from db_im_user_msg_$DBINDEX.t_im_user_msgidlist_$TBINDEX
where FtoID%4=$MOINDEX
)
AS T1;
SELECT concat(
'*3\r\n\$3\r\nset\r\n',
'\$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'\$', LENGTH(redis_value), '\r\n',
redis_value, '\r'
)
FROM(
select FtoID ,FmsgID,FdbIndex,FtableIndex,FmsgTimestamp,
concat("msg_",FmsgID) as redis_key,
FmsgTimestamp as redis_score,
concat(FmsgID,"_", FdbIndex,"_", FtableIndex) as redis_value
from db_im_user_msg_$DBINDEX.t_im_user_msgidlist_$TBINDEX
where FtoID%4=$MOINDEX
)
AS T2;
EOF
) >> $DBFILE
}

function traverse_tb()
{
DBINDEX=$1
MOINDEX=$2
#echo "traverse_tb $DBINDEX $MOINDEX"

for((nTBIndex=0;nTBIndex<64;nTBIndex++))
do
select_data $DBINDEX $nTBIndex $MOINDEX
done
}

function traverse_md()
{
DBINDEX=$1
# echo "traverse_md $DBINDEX"

for((nModNum=0;nModNum<4;nModNum++))
do
[ -f $DBFILE ] && rm -rf $DBFILE
traverse_tb $DBINDEX $nModNum
echo " mysql db_im_user_msg_$DBINDEX --skip-column-names --raw < $DBFILE | redis-cli --pipe -n $nModNum "
mysql db_im_user_msg_$DBINDEX --skip-column-names --raw < $DBFILE | redis-cli --pipe -n $nModNum
# echo "migrate data to redis,end"
done
}

function traverse_db()
{
for((nDBIndex=0;nDBIndex<4;nDBIndex++))
do
echo -e "\n-------traverse_db $nDBIndex--------------"
traverse_md $nDBIndex
done
}


function main()
{
traverse_db
}

main
 初步思路是:先把數(shù)據(jù)全量遷移到一個(gè)庫,然后keys * 到指定的記錄,再一個(gè)一個(gè)的move一遍。
|