gbase8s之导出mysql导入gbase8s
一,临时脚本(365以上,兼容mysql)
#!/bin/bash
#作者:乡村野中医
# 检查参数是否正确提供
#脚本名字:mysqldb_export.sh# MySQL连接参数
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="1qaz@WSX"
DB_NAME="test" # 数据库名
OUTPUT_DIR="OUT" # 输出目录作# 检查参数# 创建输出目录
mkdir -p "$OUTPUT_DIR/$DB_NAME"# 导出表结构
echo "导出表结构..."
mysqldump -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS --no-data $DB_NAME > "$OUTPUT_DIR/$DB_NAME/schema.sql"# 获取所有表名
TABLES=$(mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -e "SHOW TABLES;" -s --skip-column-names)# 遍历所有表
for TABLE in $TABLES; doecho "处理表: $TABLE"# 获取列信息和顺序COLUMNS=$(mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -e "DESCRIBE $TABLE;" -s --skip-column-names | awk '{print $1}')# 构建SELECT查询SELECT_QUERY="SET SESSION sql_mode = 'ALLOW_INVALID_DATES'; SELECT "FIRST_COL=true# 为每个列构建处理逻辑for COLUMN in $COLUMNS; do# 获取列类型COL_TYPE=$(mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -e "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$TABLE' AND COLUMN_NAME = '$COLUMN' AND TABLE_SCHEMA = '$DB_NAME';" -s --skip-column-names)# 构建字段处理表达式if [ "$FIRST_COL" = true ]; then# SELECT_QUERY+="CONCAT('|', "SELECT_QUERY+="CONCAT("FIRST_COL=falseelseSELECT_QUERY+=", '|', "fi# 根据不同类型处理字段if [[ "$COL_TYPE" == "year" ]]; then# YEAR类型处理 - 使用数字0进行比较SELECT_QUERY+="CASE "SELECT_QUERY+="WHEN $COLUMN IS NULL THEN '' "SELECT_QUERY+="WHEN $COLUMN = 0 THEN '' "SELECT_QUERY+="ELSE $COLUMN "SELECT_QUERY+="END"elif [[ "$COL_TYPE" == *"date"* ]] || [[ "$COL_TYPE" == *"time"* ]]; then# 日期时间类型处理 - 使用正确的日期格式进行比较SELECT_QUERY+="CASE "SELECT_QUERY+="WHEN $COLUMN IS NULL THEN '' "SELECT_QUERY+="WHEN $COLUMN = '0000-00-00 00:00:00' THEN '' "SELECT_QUERY+="WHEN $COLUMN = '0000-00-00' THEN '' "SELECT_QUERY+="WHEN $COLUMN = '00:00:00' THEN '' "SELECT_QUERY+="ELSE $COLUMN "SELECT_QUERY+="END"elif [[ "$COL_TYPE" == *"int"* ]] || [[ "$COL_TYPE" == *"float"* ]] || \[[ "$COL_TYPE" == *"double"* ]] || [[ "$COL_TYPE" == *"decimal"* ]]; then# 数值类型处理SELECT_QUERY+="CASE "SELECT_QUERY+="WHEN $COLUMN IS NULL THEN '' "SELECT_QUERY+="ELSE $COLUMN "SELECT_QUERY+="END"else# 字符串和其他类型处理SELECT_QUERY+="CASE "SELECT_QUERY+="WHEN $COLUMN IS NULL THEN '' "SELECT_QUERY+="WHEN $COLUMN = '' THEN 'KONG_ZI_FU_CHUAN' "
#SELECT_QUERY+="WHEN $COLUMN like '\\' ESCAPE '' THEN REPLACE($COLUMN, '\\', '\\\\') "
SELECT_QUERY+="WHEN $COLUMN like '%|%' THEN REPLACE($COLUMN, '|', 'DAN_SHU_XIAN') "
SELECT_QUERY+="ELSE $COLUMN "SELECT_QUERY+="END"fidoneSELECT_QUERY+=", '|') FROM $TABLE;"# 导出数据到UNL文件echo "导出数据到 $TABLE.unl..."mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -D$DB_NAME -e "$SELECT_QUERY" -s --skip-column-names > "$OUTPUT_DIR/$DB_NAME/$TABLE.unl"sed -i 's/KONG_ZI_FU_CHUAN/\\\ /g' "$OUTPUT_DIR/$DB_NAME/$TABLE.unl" sed -i 's/DAN_SHU_XIAN/\\\|/g' "$OUTPUT_DIR/$DB_NAME/$TABLE.unl"# 创建CTL文件echo "生成 $TABLE.ctl..."CTL_FILE="$OUTPUT_DIR/$DB_NAME/schema.ctl">$CTL_FILE# 构建列名列表COL_LIST=""FIRST_COL=truefor COLUMN in $COLUMNS; doif [ "$FIRST_COL" = true ]; thenCOL_LIST="$COLUMN"FIRST_COL=falseelseCOL_LIST+=", $COLUMN"fidone# 构建值占位符VALUE_PLACEHOLDERS=""col_count=1for COLUMN in $COLUMNS; doif [ $col_count -eq 1 ]; thenVALUE_PLACEHOLDERS="f$(printf "%02d" $col_count)"elseVALUE_PLACEHOLDERS+=", f$(printf "%02d" $col_count)"fi((col_count++))done# 获取表的列数COLUMN_COUNT=$(mysql -h $DB_HOST -P$DB_PORT -u $DB_USER -p$DB_PASS -N -B -e \"SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '$DB_NAME' AND table_name = '$TABLE'" information_schema)# 写入CTL文件echo "FILE $TABLE.unl DELIMITER '|' $COLUMN_COUNT ;" >> $CTL_FILEecho "INSERT INTO $TABLE ($COL_LIST) VALUES($VALUE_PLACEHOLDERS);" >> $CTL_FILE
doneecho "导出完成!所有文件已保存到: $OUTPUT_DIR/$DB_NAME/"# 目标目录
TARGET_DIR="`pwd`/$OUTPUT_DIR/$DB_NAME"
mkdir -p $TARGET_DIR
# 检查目标目录是否存在
if [ ! -d "$TARGET_DIR" ]; thenecho "错误: 目录 $TARGET_DIR 不存在"exit 1
fi# 目标脚本文件名
output_script="$TARGET_DIR/gbase8s_import.sh"# 切换到目标目录
cd "$TARGET_DIR" || exit 1# 清空或创建目标脚本文件
> "$output_script"# 添加shebang和参数检查
cat << 'EOF' > "$output_script"
#!/bin/bash# 检查参数是否正确提供
if [ $# -ne 2 ]; thenecho "用法: $0 DB_NAME IMPORT_TYPE"exit 1
fi# 获取数据库名称参数
DB_NAME="$1"
db_exists=$(dbaccess sysmaster - 2>/dev/null <<!
SELECT COUNT(*) FROM sysdatabases WHERE name = '$DB_NAME';
!
)# 提取查询结果中的数字,并处理可能的空值
count=$(echo "$db_exists" | grep -E '[0-9]+' | head -1 | tr -d '[:space:]')# 确保count有值,如果为空则设为0
if [ -z "$count" ]; thencount=0
fi# 判断并输出结果
if [ "$count" -gt 0 ]; thenecho "$DB_NAME库存在"
elseecho "$DB_NAME库不存在"exit
fi
IMPORT_TYPE="$2"
case $IMPORT_TYPE in
ALL)
dbaccess $DB_NAME schema.sql
dbload -d $DB_NAME -c $ctl_file -l err.log -n 10000
;;
DDL)
dbaccess $DB_NAME schema.sql
;;
DATA)
dbload -d $DB_NAME -c $ctl_file -l err.log -n 10000
;;
*)
echo "IMPORT_TYPE is ALL|DDL|DATA"
exit
esac
EOF# 查找当前目录下所有.ctl文件并处理
find . -maxdepth 1 -name "*.ctl" | while read -r file; do# 提取文件名(不含路径)ctl_file=$(basename "$file")# 生成dbload命令并追加到脚本文件
# echo "dbload -d \$DB_NAME -c $ctl_file -l ${ctl_file}_err.log -n 10000" >> "$output_script"
echo "dbload -d \$DB_NAME -c $ctl_file -l err.log -n 10000" >> "$output_script"
done# 赋予目标脚本执行权限
chmod +x "$output_script"echo "生成完成:$output_script"
echo "使用方法: ./$output_script 数据库名"
使用方法:
1,先到脚本mysqldb_export.sh配置好mysql连接信息
2,然后sh mysqldb_export.sh
3,把当前目录生成的文件打包
4,把打包文件放到gbase8s的家目录
5,su - gbasedbt;unzip 或tar解压
6,执行导入,先建好目标库
1)导入dll和数据
sh gbase8s_import.sh 库名 ALL
2)导入数据
sh gbase8s_import.sh 库名 DATA
3)导入DDL
sh gbase8s_import.sh 库名 DDL
第二,标准脚本(暂时不建议用)
#!/bin/bash
#作者乡村野中医
# 配置参数
DB_HOST="::1"
DB_USER="yunanbao"
DB_PASS="z&0o_^HOvMD<712Q)Pa3xod#pf5^A5^4"
DB_NAME="yunxiazi3.0"
OUTPUT_DIR="`pwd`/$DB_NAME"
PORT="31036"
# 创建输出目录
#mkdir -p $OUTPUT_DIR
#chown mysql:mysql $OUTPUT_DIR
#chmod 755 $OUTPUT_DIR
echo "获取 MySQL secure_file_priv 设置..."
SECURE_FILE_PRIV=$(mysql -h $DB_HOST -u $DB_USER -P$PORT -p$DB_PASS -N -s -e "SELECT @@GLOBAL.secure_file_priv" 2>/dev/null)
if [-z $SECURE_FILE_PRIV ];then
echo """#查看
SHOW VARIABLES LIKE 'secure_file_priv';
#设置
SET GLOBAL secure_file_priv = '/tmp/';
#-- 授予 FILE 权限给特定用户
GRANT FILE ON *.* TO 'your_username'@'localhost';
#-- 或者,如果你使用 root 用户(不推荐在生产环境中使用)
GRANT FILE ON *.* TO 'root'@'localhost';
#-- 刷新权限
#FLUSH PRIVILEGES;
"""
exit
fi
# 导出所有表结构
echo "Exporting DDL..."
>$SECURE_FILE_PRIV/${DB_NAME}.ctl
mysqldump -h $DB_HOST -u $DB_USER -P$PORT -p$DB_PASS --no-data $DB_NAME > $SECURE_FILE_PRIV/schema.sql# 获取所有表名
TABLES=$(mysql -h $DB_HOST -u $DB_USER -P$PORT -p$DB_PASS -N -B -e "SHOW TABLES" $DB_NAME)# 导出每个表的数据为 gbase8s UNLOAD 格式
for TABLE in $TABLES
doecho "Exporting data for table: $TABLE"# 获取表的列数COLUMN_COUNT=$(mysql -h $DB_HOST -P$PORT -u $DB_USER -p$DB_PASS -N -B -e \"SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '$DB_NAME' AND table_name = '$TABLE'" information_schema)# 创建 UNLOAD 文件头,包含正确的列数echo "FILE $TABLE.unl DELIMITER '|' $COLUMN_COUNT ;" >> $SECURE_FILE_PRIV/${DB_NAME}.ctlecho "INSERT INTO $TABLE;" >> $SECURE_FILE_PRIV/${DB_NAME}.ctl
done # 导出数据,使用 | 作为分隔符mysql -h $DB_HOST -u $DB_USER -P$PORT -p$DB_PASS -N -B -e "
SELECT table_name
FROM information_schema.tables
WHERE table_schema = '$DB_NAME'
" | while read TABLE; doif [ "$TABLE" != "table_name" ]; thenecho "导出表: $TABLE"mysql -h $DB_HOST -u $DB_USER -P$PORT -p$DB_PASS -N -B $DB_NAME -e "
SELECT * INTO OUTFILE '$SECURE_FILE_PRIV/$TABLE.unl'FIELDS TERMINATED BY '|'OPTIONALLY ENCLOSED BY '\"'ESCAPED BY ''LINES TERMINATED BY '\n'FROM $TABLE;"fi
doneecho "Export completed! Files are in: $SECURE_FILE_PRIV"
echo "dbload -d yunxiazi3.0 -c ${DB_NAME}.ctl -l error.log -n 10000 "> $SECURE_FILE_PRIV/import.sh
用法:
1,配置好mysqldb_export.sh 的连接参数
2,执行sh mysqldb_export.sh导出
3,在mysql的默认输出路径,打包所有输出文件
4,修改权限,在gbasedbt家目录执行./import.sh执行导入,记得先建好库