| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #!/bin/bash
- # 检查参数数量
- if [ "$#" -ne 2 ]; then
- echo "用法: $0 源数据库 目标数据库"
- exit 1
- fi
- # 获取源数据库和目标数据库
- src_db=$1
- dst_db=$2
- # 初始化游标
- cursor=0
- # 使用 SCAN 分批次扫描键
- while true; do
- # 扫描一批键
- result=$(redis-cli -n $src_db SCAN $cursor MATCH "*" COUNT 100)
- cursor=$(echo "$result" | head -n 1) # 获取新的游标
- keys=$(echo "$result" | tail -n +2) # 获取当前批次的键
- # 遍历当前批次的键
- for key in $keys; do
- # 检查键名是否包含源数据库编号,如果是则替换为目标数据库编号
- new_key=$(echo "$key" | sed "s/account_${src_db}_/account_${dst_db}_/g")
- # 获取键的类型
- type=$(redis-cli -n $src_db TYPE "$key")
- # 根据类型复制数据
- case $type in
- "string")
- value=$(redis-cli -n $src_db GET "$key")
- redis-cli -n $dst_db SET "$new_key" "$value"
- ;;
- "hash")
- fields=$(redis-cli -n $src_db HGETALL "$key")
- redis-cli -n $dst_db HMSET "$new_key" $fields
- ;;
- "list")
- elements=$(redis-cli -n $src_db LRANGE "$key" 0 -1)
- redis-cli -n $dst_db RPUSH "$new_key" $elements
- ;;
- "set")
- members=$(redis-cli -n $src_db SMEMBERS "$key")
- redis-cli -n $dst_db SADD "$new_key" $members
- ;;
- "zset")
- members=$(redis-cli -n $src_db ZRANGE "$key" 0 -1 WITHSCORES)
- redis-cli -n $dst_db ZADD "$new_key" $members
- ;;
- esac
- done
- # 如果游标为 0,表示扫描完成
- if [ "$cursor" -eq 0 ]; then
- break
- fi
- done
- echo "数据复制完成!"
|