OA系统信创迁移流程

需要对3000余套律所OA系统进行迁移,按天逐步迁移。基本流程如下:

1.申请瀚高测试license兼容适配
2.适配前对现有系统进行升级,提高后期迁移效率
3.编写相关脚本

4.申请服务器(申请临时互联网访问)、环境搭建、打通相关网络
5.停止新功能开发、升级(新系统直接在新服务器搭建)
6.数据库创建3种流程对应的默认模版(install_v0/1/2/3,指定所属用户)及空模版(空模板包含city、log_2026/2027表)、开启兼容模式为mysql(部分兼容函数无需添加到public模式)
7.使用 chattr.sh 脚本清理全部站点目录只读权限(非必要)
8.搭建cdn128系统为本地内网IP访问(需对外提供服务,内部使用IP)
9.上线t00x测试系统对接律管测试系统进行测试(同时上线几个常用所,接口及功能;迁移后需进行数据对比;测试系统安装程序)
10.信创OA服务器免密登录原OA服务器
11.发布版本进行升级测试(含文件、sql、模板变动)
12.测试完成,整理各服务器对应的系统名单(区分未安装、已注销暂不迁移)
13.省厅下发通知
14.使用mysql_drop.bat脚本清理历史数据库;

@echo off
setlocal enabledelayedexpansion

rem 设置数据库连接参数
set "mysql_path=E:\wamp\bin\mysql\mysql5.7.31\bin"
set MYSQL_USER=root
set MYSQL_PASSWORD=ss@2021
set MYSQL_HOST=localhost
set "filePath=oa_dir_ss.txt"

rem 检查文件是否存在
if not exist "%filePath%" (
    echo 文件 %filePath% 不存在。
    exit /b 1
)

rem 循环创建数据库并导入数据
for /f "delims=" %%i in (%filePath%) do (
    echo %%i
    rem 创建数据库
    mysql -u%MYSQL_USER% -p%MYSQL_PASSWORD% -h%MYSQL_HOST% -e "DROP DATABASE IF EXISTS %%i;"
)

echo All databases dropped.
pause

15.确定当前批次迁移律所名单,修改 oa_dir.sh、oa_dir.txt(同步修改新老服务器、本地)(按服务器逐台迁移,127优先,如必要则预约后迁移)

#!/bin/bash

#所在目录
baseDir="/web/oa/"

#自动获取系统目录文件 仅可包含oa系统文件
#sysDir=`ls /web/oa`

#本次需处理的目录
sysDir=(xxx xxx)

16.使用 stop_web.sh 脚本停用本批次系统(调整默认页面说明文字,同新服务器默认页)

#!/bin/bash

#---------------------------------------
# step1 停用本批次系统
# root /www/server/stop/public;
# #include
# author: SenSen 1050575278
# date: 2021/10/10
#---------------------------------------

#read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
#if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #本批次系统
  source ./oa_dir.sh

  if [ ${#sysDir[@]} -eq 0 ]; then
    exit 1
  fi

  cd /www/server/panel/vhost/nginx

  # 数据库文件路径
  DB_FILE="/www/server/panel/data/db/site.db"

  for f in "${sysDir[@]}"
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #执行对应操作
      find ${f}.speaklaw.cn.conf | xargs sed -i "s/include/#include/"
      find ${f}.speaklaw.cn.conf | xargs sed -i "s#/web/oa/${f}/public;#/www/server/stop/public; location / { try_files '' /index.html; } location = /index.html { index index.html; }#"

      #修改sites表中的status=0
      #获取要更新的ID
      ID=$(sqlite3 $DB_FILE "SELECT id FROM sites WHERE name='${f}.speaklaw.cn';")
      UPDATE_SQL="UPDATE sites SET status = 0 WHERE id = $ID;"
      # 执行SQL更新语句
      sqlite3 $DB_FILE "$UPDATE_SQL"

      echo "${curtime} ${f} stopped" >> /web/stop_web.log
    done

  #重新加载nginx配置
  nginx -s reload
# else
#   echo "Error: invalid input"
# fi
#!/bin/bash

#---------------------------------------
# 开启网站
# root /www/server/stop/public;
# #include
# author: SenSen 1050575278
# date: 2021/10/10
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #本批次系统
  source ./oa_dir.sh

  if [ ${#sysDir[@]} -eq 0 ]; then
    echo 'empty'
    exit 1
  fi

  cd /www/server/panel/vhost/nginx

  # 数据库文件路径
  DB_FILE="/www/server/panel/data/db/site.db"

  for f in "${sysDir[@]}"
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #执行对应操作
      find ${f}.speaklaw.cn.conf | xargs sed -i "s/#include/include/"
      find ${f}.speaklaw.cn.conf | xargs sed -i "s#/www/server/stop/public; location / { try_files '' /index.html; } location = /index.html { index index.html; }#/web/oa/${f}/public;#"

      #修改sites表中的status=0
      #获取要更新的ID
      ID=$(sqlite3 $DB_FILE "SELECT id FROM sites WHERE name='${f}.speaklaw.cn';")
      UPDATE_SQL="UPDATE sites SET status = 1 WHERE id = $ID;"
      # 执行SQL更新语句
      sqlite3 $DB_FILE "$UPDATE_SQL"

      echo "${curtime} ${f} started" >> /web/start_web.log
    done

  #重新加载nginx配置
  nginx -s reload
else
  echo "Error: invalid input"
fi

17.中心系统标记本批次系统为不更新
UPDATE law_firm SET is_sync=0 WHERE SUBSTRING(domain, 8, 4) in ('xxx', 'xxx');

18.使用 mysql_dump.sh 脚本批量导出原系统数据库(本次备份不含city、log表等公共表,需先创建mysql_backup目录)

#!/bin/bash

#---------------------------------------
# 备份指定数据库
# author: SenSen 1050575278
# date: 2024/07/17
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

# 定义MySQL配置和备份参数
MYSQL_USER="root"
MYSQL_PASSWORD="xxxx"
BACKUP_DIR="/mysql_backup"
CURRENT_DATE=$(date +%Y%m%d_%H%M%S)

# 确保备份目录存在
mkdir -p $BACKUP_DIR
rm -rf /mysql_backup/*.sql
rm -rf /adown/all_sql.zip

# 获取所有数据库的列表
#DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'SHOW DATABASES;' | grep -v Database)

#备份指定数据库
source ./oa_dir.sh

if [ ${#sysDir[@]} -eq 0 ]; then
  exit 1
fi

# 遍历所有数据库并进行备份
for db in "${sysDir[@]}"; do
    echo "Backing up database: $db"
    # 排除无需迁移的表 提高效率
    mysqldump -P 3306 -u$MYSQL_USER -p$MYSQL_PASSWORD $db --ignore-table=$db.city --ignore-table=$db.log_2022 --ignore-table=$db.log_2023 --ignore-table=$db.log_2024 > $BACKUP_DIR/$db.sql

    #获取当前时间
    curtime=`date +"%Y/%m/%d %H:%M:%S"`
    # 输出备份完成信息
    echo "${curtime} ${db} completed." >> /web/mysql_dump.log
done

# 将以上文件打包
zip -r /adown/all_sql.zip /mysql_backup/*

# 输出完成信息
echo "Backup completed at $CURRENT_DATE. Files are saved in $BACKUP_DIR."

19.使用 mysql_import.bat 脚本批量导入数据库到本地

@echo off
setlocal enabledelayedexpansion

rem 设置数据库连接参数
set "mysql_path=E:\wamp\bin\mysql\mysql5.7.31\bin"
set MYSQL_USER=root
set MYSQL_PASSWORD=ss@2021
set MYSQL_HOST=localhost
set "filePath=oa_dir_ss.txt"

rem 检查文件是否存在
if not exist "%filePath%" (
    echo 文件 %filePath% 不存在。
    exit /b 1
)

rem 循环创建数据库并导入数据
for /f "delims=" %%i in (%filePath%) do (
    echo %%i
    rem 创建数据库
    mysql -u%MYSQL_USER% -p%MYSQL_PASSWORD% -h%MYSQL_HOST% -e "CREATE DATABASE IF NOT EXISTS %%i; USE %%i;"

    rem 导入数据
    mysql -u%MYSQL_USER% -p%MYSQL_PASSWORD% -h%MYSQL_HOST% %%i < "d:\hg\%%i.sql"
)

echo All databases created and data imported successfully.
pause

20.使用 clear.sh 脚本清理原系统临时文件(主要清理临时文档)

#!/bin/bash

#---------------------------------------
# step1 清理系统临时文件(含log)
# author: SenSen 1050575278
# date: 2021/10/10
#---------------------------------------

#read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
#if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then

  #导入本批次系统
  source ./oa_dir.sh

  if [ ${#sysDir[@]} -eq 0 ]; then
    exit 1
  fi

  for f in "${sysDir[@]}"
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #进入目录
      cd ${baseDir}${f}

      #清除uploads临时文档
      rm -rf public/uploads/doc/case/*
      rm -rf public/uploads/doc/consult/*
      rm -rf public/uploads/doc/dczm/*
      rm -rf public/uploads/doc/gwdwrz/*
      rm -rf public/uploads/doc/gzrz/*
      rm -rf public/uploads/doc/hjdj/*
      rm -rf public/uploads/doc/jsx/*
      rm -rf public/uploads/doc/lsh/*
      rm -rf public/uploads/doc/yjs/*
      rm -rf public/uploads/doc/report_affair/*
      rm -rf public/uploads/doc/report_consultant/*
      rm -rf public/uploads/doc/report_cooperate/*
      rm -rf public/uploads/doc/report_internal/*
      rm -rf public/uploads/doc/report_month/*
      rm -rf public/uploads/doc/report_year/*
      #清除其他
      rm -rf public/uploads/doc_tpl
      rm -rf public/uploads/grid_report
      rm -rf public/uploads/dossier
      rm -rf public/uploads/dossiers
      rm -rf public/uploads/notice
      rm -rf public/uploads/pdf
      rm -rf public/uploads/lawyer/doc/*
      rm -rf public/uploads/level/doc/*
      rm -rf public/uploads/prove/*
      rm -rf public/uploads/qrcode/*
      rm -rf public/uploads/report/*
      rm -rf public/uploads/rollback/*
      rm -rf public/uploads/rollback_apply/*
      rm -rf public/uploads/tmp/*

      echo "${curtime} ${f} done" >> /web/clear.log
    done
# else
#   echo "Error: invalid input"
# fi

21.使用 file_zip.sh 脚本打包各律所生产的文件,并统一打包为 all.zip (需先创建/web/zips,确保空间充足)

#!/bin/bash
#---------------------------------------
# step3 同步网站律所生成数据数据
# 需打包install目录,避免install.lock丢失
# 考虑先同步指定日期前数据,正式上线时再同步增量数据(不考虑此模式,同步处理)
# 清理runtime -> 源服务器按OA单独打包到统一目录,并记录目录(排除app、config、addons、extend、route、sensen、services、upgrade、runtime、vendor、public|addons|install|plugins|static|)->调用升级程序更新未打包目录(使用脚本)->使用脚本打包源服务器增量数据->新服务器解压(确保目录一致)->删除增量备份压缩包->检查文件用户组
# author: SenSen 1050575278
# date: 2024/02/01
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

# 打包程序

#导入本批次系统
source ./oa_dir.sh

if [ ${#sysDir[@]} -eq 0 ]; then
  exit 1
fi

cd /web/zips
# 清理当前目录文件
rm -rf /web/zips/*.zip
rm -rf /adown/all128.zip

for f in "${sysDir[@]}"
  do
    fileDir=${baseDir}${f}
    # 执行压缩 期间禁止安装新OA
    # .env文件由系统统一拷贝、static等文件参考线上版本使用cdn
    zip -r ${f}.zip ${fileDir}/public/install/install.lock ${fileDir}/public/tpl ${fileDir}/public/uploads ${fileDir}/public/.htaccess ${fileDir}/public/upgrade_code.txt ${fileDir}/public/version.txt

    #获取当前时间
    curtime=`date +"%Y/%m/%d %H:%M:%S"`

    # 输出备份完成信息
    echo "${curtime} ${f} completed." >> /web/file_zip.log
  done

# 将以上文件打包
zip -r /adown/all128.zip ./*


#系统目录
#app
#config
#extend
#route
#runtime
#sensen
#upgrade
#vendor
#.logic
#.env(2024年无初始化CASE编号,故无需同步此文件,此文件需批量替换)
#think
#composer*
#public/index.html | 404.html
#public/install(不含install.lock)
#public/qrcode/pay
#public/exception.tpl | favicon.ico | index.php | robots.txt | router.php | upgrade.php (不含upgrade_code.txt、version.txt、.logic)


##public/uploads(全量同步原系统)
##public/json
##public/addons
##public/static(使用cdn,无需打包本目录)
##public/plugins(使用cdn,已使用浏览器替代pdfjs)
##其他空目录结构

22.使用宝塔批量创建系统(格式:xx.speaklaw.cn|/web/oa/xx|0|0|74)
23.新服务器使用 pull.sh 脚本拉取(如不支持则手动上传)all.zip

#!/bin/bash
#---------------------------------------
# step3 拉取原服务器律所生产的数据包
# author: SenSen 1050575278
# date: 2024/02/01
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

# 拉取 all.zip 解压到 /web/oa
cd /web/old || exit

#本批次系统
source /web/shell/oa_dir.sh

if [ ${#sysDir[@]} -eq 0 ]; then
  exit 1
fi

rm -rf /web/old/*.zip

scp -r root@10.254.20.125:/adown/all125.zip .
scp -r root@10.254.20.126:/adown/all126.zip .
scp -r root@10.254.20.127:/adown/all127.zip .
scp -r root@10.254.20.128:/adown/all128.zip .

unzip all125.zip
unzip all126.zip
unzip all127.zip
unzip all128.zip

24.新服务器使用 deploy.sh 脚本部署系统

#!/bin/bash

#---------------------------------------
# 已安装系统迁移部署程序
# 1. 复制程序 2. 创建虚拟主机配置文件
# author: SenSen 1050575278
# date: 2024/07/18
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#确定版本号
read -p "Enter Version Code to continue : " code

if [ "$code" ]; then

  #导入本批次系统
  source ./oa_dir.sh

  if [ ${#sysDir[@]} -eq 0 ]; then
    echo "empty"
    exit 1
  fi

  #源文件 依据系统版本
  sourceFile="/web/source/${code}.zip";

  #判断文件是否存在
  if [ ! -f "${sourceFile}" ];then
    echo "Error: Source Code File not found"
    exit
  fi

  #中创目录
  lbPath="/www/server/panel/vhost/"

  for f in "${sysDir[@]}"
    do
      #检测目录是否已存在
#      if [ -d "${baseDir}${f}" ];then
#        echo "Error: ${f} already exists"
#        exit
#      fi

      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #律所生产的数据 通过file_zip打包后统一上传到本目录
      lawfirmData="/web/old/${f}.zip";

      #复制
      cp -rf "${sourceFile}" ${baseDir}${f}".zip"
      #解压 默认解压到当前
      unzip -oq ${baseDir}${f} -d ${baseDir}${f}
      #删除压缩包
      rm -rf ${baseDir}${f}".zip"

      #创建虚拟主机配置文件 由于nginx和中创目录不同,批量创建网站后不会被覆盖
      cp "/web/shell/thinkphp_conf.conf" ${lbPath}"nginx/${f}.speaklaw.cn.conf"
      find ${lbPath}"nginx/${f}.speaklaw.cn.conf" | xargs sed -i "s/sensen/${f}/"

      #创建伪静态配置文件
      cp "/web/shell/sensen.speaklaw.cn.conf" ${lbPath}"rewrite/${f}.speaklaw.cn.conf"

      #进入系统目录
      cd ${baseDir}${f}

      #替换.env文件内容
      find .env | xargs sed -i "s/DB_NAME/${f}/"
      #sed -i.bak "12s/DB_NAME/${f}/" .env

      #必要目录禁止修改
      #chattr -R +i public/index.php
      #chattr -R +i app/index/view/login/index.html
      #chattr -R +i vendor
      #chattr -R +i config
      #chattr -R +i app
      #chattr -R +i route
      #chattr -R +i sensen

      #拉取律所生产的数据
      cp -rf "${lawfirmData}" ./uploads.zip
      unzip -oq uploads.zip

      cp -rf ./web/oa/${f}/public/* ./public/
      rm -rf uploads.zip
      rm -rf ./web

      #变更用户组
      chown -R www:www ${baseDir}${f}

      echo "${curtime} ${f} done" >> /web/deploy.log
    done
else
    echo "Error: param is empty"
fi

25.使用 mysql_drop.sh 脚本清理不必要的往年日志表(log_2022/2023/2024/city)等
26.使用 create_pg.sh 脚本批量创建瀚高数据库(install_v0默认包含函数、表city、log_2026/2027等,一次性创建所有数据库)

#!/bin/bash
#---------------------------------------
# step3 批量创建数据库 使用 install_v0 模版
# author: SenSen 1050575278
# date: 2024/07/19
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#导入本批次系统
sysDir=()


# PostgreSQL登录信息
PGUSER="sysdba"
PGHOST="localhost"
PGPORT="5866"

for f in "${sysDir[@]}"
  do
    #获取当前时间
    curtime=`date +"%Y/%m/%d %H:%M:%S"`
    # 执行SQL文件
    psql -U "$PGUSER" -h $PGHOST -p $PGPORT -c "CREATE DATABASE $f template install_v0;"

    # 检查状态
    if [ $? -eq 0 ]; then
        echo "${curtime} db '$f' created successfully." >> /web/create_pg.log
    else
        echo "${curtime} Failed to create db '$f'" >> /web/create_pg.log
    fi
  done

27.使用瀚高迁移工具逐个系统进行数据库迁移(谨慎操作,避免覆盖)
28.确认迁移结果无错误
29.检测LB配置是否无误,重载配置
30.变更本批次域名解析(excel)
31.执行 check_tables.sh 脚本检测数据表、主键数量是否正确

#!/bin/bash
#---------------------------------------
# step3 批量创建数据库 使用 install_v0 模版
# author: SenSen 1050575278
# date: 2024/07/19
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#导入本批次系统
sysDir=(xxx xxx)
# PostgreSQL登录信息

echo > /web/check_tables.log
echo > /web/check_sequence.log
# echo > /web/check_primary.log

for f in "${sysDir[@]}"
  do
    #获取当前时间
    curtime=`date +"%Y/%m/%d %H:%M:%S"`
    # 执行SQL文件
    echo $f >> /web/check_tables.log
    psql -U "sysdba" -d "$f" -c "SELECT COUNT(*) FROM pg_catalog.pg_tables WHERE schemaname = 'public';" >> /web/check_tables.log
    echo $f >> /web/check_sequence.log
    psql -U "sysdba" -d "$f" -c "SELECT COUNT(*) FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind = 'S' AND n.nspname = 'public';" >> /web/check_sequence.log
    
    # echo $f >> /web/check_primary.log
    # psql -U "sysdba" -d "$f" -c "SELECT COUNT(*) AS number_of_primary_key_columns FROM information_schema.table_constraints JOIN information_schema.key_column_usage USING (constraint_name, table_schema, table_name) WHERE constraint_type = 'PRIMARY KEY' AND table_schema = 'public';" >> /web/check_primary.log
    
  done

32.使用 check_url.sh 脚本检测各系统是否迁移成功(使用律管系统测试,OA无法互通)

#!/bin/bash

#---------------------------------------
# 检测网站是否正常运行
# author: SenSen 1050575278
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#本批次系统
sysDir=(xxx xxx)

for f in "${sysDir[@]}"
  do
    # URL to check
    URL="http://${f}.baidu.com/api/check_sys_status"

    #获取当前时间
    curtime=`date +"%Y/%m/%d %H:%M:%S"`

    # Fetch the content
    CONTENT=$(curl --silent "$URL")
    if echo "$CONTENT" | grep -q "success"; then
        echo "${curtime} ${f} running." >> /web/check_url.log
    elif echo "$CONTENT" | grep -q "no_name"; then
        echo "${curtime} ${f} not get name." >> /web/check_url.log
    else
        echo "${curtime} ${f} not running." >> /web/check_url.log
    fi
  done

33.开启数据库日志
34.测试指定批次数据库备份、恢复脚本 pg_dump.sh pg_dumpall.sh pg_basebackup.sh pg_restore.sh

#!/bin/bash
#---------------------------------------
# pg数据库备份
# author: SenSen 1050575278
# date: 2024/02/01
# crontab 定时执行 / 使用独立脚本同步oss
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

# 配置变量
DB_USER='sysdba'


# todo 调整为每分钟备份一次
# 1. 获取当前数据库目录;2. 获取今日未备份的1个库;3. 执行备份


#系统目录
#sysDir=`ls /web/oa`

#source /web/shell/get_database_list.sh

sysDir=(`cat /web/database_list.txt`)

nowDay=`date +"%Y%m%d"`

for f in "${sysDir[@]}"
  do
    nowTime=`date +"%Y/%m/%d %H:%M:%S"`
    BACKUP_PATH='/nfs/lulvtong/database'
    BACKUP_PATH=${BACKUP_PATH}/${f}

    #如果今日已备份则跳过
#    if [ -f "${BACKUP_PATH}/${f}_${nowDay}.backup.gz" ];then
#      echo "${nowTime} Backup of ${f} already exists." >> /web/pg_dump.log
#      continue
#    fi

    # 创建备份目录
    if [ ! -d "${BACKUP_PATH}" ];then
      mkdir -p "$BACKUP_PATH"
    fi

    # 执行备份 todo 排除指定的表
    /opt/highgo/hgdb-see-4.5.8/bin/pg_dump -U "$DB_USER" -Fc --exclude-table-data=log_2025 --exclude-table-data=log_2026 --exclude-table-data=log_2027 --exclude-table-data=city "${f}" > "$BACKUP_PATH/${f}_${nowDay}.backup"
    # 压缩备份文件
    #gzip "$BACKUP_PATH/${f}_${nowDay}.backup"
    # 删除多余的文件 仅保留最近30天
    declare -i ReservedNum=30
    # 查询当前文件夹下文件数量
    declare -i FileNum=$(ls -l $BACKUP_PATH/* |grep ^- |wc -l)
    #旧数据在上,从head开始删除
    while(($FileNum > $ReservedNum))
    do
        OldFile=$BACKUP_PATH/$(ls -rt $BACKUP_PATH/| head -1)
        echo  "Delete File:" $OldFile >> /web/pg_dump.log
        rm -rf $OldFile
        let "FileNum--"
    done
    # 输出备份完成信息
    echo "${nowTime} Backup of ${f} completed." >> /web/pg_dump.log
  done
#!/bin/bash
#---------------------------------------
# pg数据库恢复
# author: SenSen 1050575278
# date: 2024/02/01
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#指定恢复日期
read -p "Tips! Enter backup file date (like '20240201') to continue : " nowDay

# 配置变量
DB_USER='sysdba'
PGHOST="localhost"
PGPORT="5866"
BACKUP_PATH='/nfs/lulvtong/database'

#系统目录
#sysDir=`ls /web/oa`
sysDir=(t005)

for f in "${sysDir[@]}"
  do
    nowTime=`date +"%Y/%m/%d %H:%M:%S"`

    cd ${BACKUP_PATH}/${f}
    nowFile="${f}_${nowDay}"

    if [ ! -f "${nowFile}.backup.gz" ]; then
      echo "${nowFile} not found"
      break
    fi

    #删除数据
    #dropdb -U "$DB_USER" ${f}

    #创建数据库 使用模版仅包含函数
    psql -U "$DB_USER" -h $PGHOST -p $PGPORT -c "CREATE DATABASE $f;"

    # 解压
    #gunzip -cf "${nowFile}.backup.gz" > "${nowFile}.backup"
    # 执行恢复 -C 恢复前先创建
    pg_restore -U "$DB_USER" -d ${f} "${nowFile}.backup"
    # 输出备份完成信息
    echo "${nowTime} Restore of ${f} completed." >> /web/pg_restore.log
  done
#!/bin/bash

file="/web/database_list.txt"

# 使用psql获取数据库列表,并去除空白行
formatted_databases=$(psql -U 'sysdba' -lqt | cut -d \| -f 1 | sed '/^\s*$/d')

formatted_databases=$(echo "$formatted_databases" | tr -d ' ')

# 将换行符替换为空格
formatted_databases=$(echo "$formatted_databases" | tr '\n' ' ')

# 输出结果
echo "$formatted_databases" > "$file"

# 删除指定值
sed -i "s/ highgo//g" "$file"
sed -i "s/ install_v0//g" "$file"
sed -i "s/ install_v1//g" "$file"
sed -i "s/ install_v2//g" "$file"
sed -i "s/ install_v3//g" "$file"
sed -i "s/ template0//g" "$file"
sed -i "s/ template1//g" "$file"

35.全部迁移完成后,新服务器使用 create.sh 脚本搭建未安装的律所系统
36.服务器部署相关计划任务
37.将空闲域名解析到新服务器
38.使用 clear.sh 脚本清理原系统临时文件(主要清理临时文档)

#!/bin/bash

#---------------------------------------
# 清理系统临时文件
# author: SenSen 1050575278
# date: 2021/10/10
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #所在目录
  dir='/web/oa/'

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /web/oa`
#   sysDir=(t001)

  #排除目录
  excluded=()

  for f in ${sysDir}
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #排除指定目录
      if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
        echo "jump"
        continue
      fi

      #进入目录
      cd ${dir}${f}
      #执行对应操作
      #清除runtime 不包含log session等 todo 支持删除缓存或所有
      rm -rf runtime/*
      #清除uploads
      rm -rf public/phpExcel/*
      rm -rf public/qrcode/pay/*
      rm -rf public/uploads/doc/case/*
      rm -rf public/uploads/doc/consult/*
      rm -rf public/uploads/doc/dczm/*
      rm -rf public/uploads/doc/gzrz/*
      rm -rf public/uploads/doc/hjdj/*
      rm -rf public/uploads/doc/jsx/*
      rm -rf public/uploads/doc/lsh/*
      rm -rf public/uploads/doc/yjs/*
      rm -rf public/uploads/doc/report_affair/*
      rm -rf public/uploads/doc/report_consultant/*
      rm -rf public/uploads/doc/report_cooperate/*
      rm -rf public/uploads/doc/report_internal/*
      rm -rf public/uploads/doc/report_month/*
      rm -rf public/uploads/doc/report_year/*
      #清除其他
      rm -rf public/uploads/level/doc/*
      rm -rf public/uploads/prove/*
      rm -rf public/uploads/qrcode/*
      rm -rf public/uploads/report/*
      rm -rf public/uploads/tmp/*

      echo "${curtime} ${f} done"
    done
else
  echo "Error: invalid input"
fi

39.调整数据库备份定时任务包含log表,全量备份并下载(永久存档)
40.使用 backup_all.sh 备份原服务器完整数据到本地(永久存档)

#!/bin/bash

#---------------------------------------
# 备份oa数据到指定目录下
# author: SenSen 1050575278
# date: 2022/04/13
# todo 调整为增量备份(当前数据量有限,暂不处理)
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#导入本批次系统
source ./oa_dir.sh

#所在目录
dist='/bak_oa/'
#指定天开始备份 todo 调整为指定天进行全量备份
backDay=(01 09 22 28)
dayNum=`date +"%d"`
#单次备份的oa数量
perNum=10
day=`date +"%Y%m%d"`
dayFile='/backup/'${day}

#判断目录是否存在
if [ ! -d "$dist" ]; then
    mkdir "$dist"
fi

num=0
tmp=()

for i in "${backDay[@]}"
  do
    if [[ "${i}" == "${dayNum}" ]]; then

      if [ ! -f "${dayFile}" ]; then
        touch ${dayFile}
      fi

      #获取指定数量的未备份oa
      for f in ${sysDir}
        do
          #判断是否今日已执行备份
          if [ `grep -c ${f} ${dayFile}` -eq 0 ];then
            #记入到新数组
            tmp[${num}]=${f}
            ((num++))
            if [ ${num} -eq ${perNum} ]; then
              break
            fi
          fi
        done

      #执行备份
      for f in "${tmp[@]}"
        do
          #判断是否今日已执行备份
          curtime=`date +"%Y/%m/%d %H:%M:%S"`
          cd ${baseDir}
          # todo 需备份一份完整数据
          tar -zcf ${dist}${f}.tar.gz --exclude=app --exclude=addons --exclude=config --exclude=extend --exclude=route --exclude=runtime --exclude=sensen --exclude=upgrade --exclude=vendor --exclude=public/addons --exclude=public/json --exclude=public/plugins --exclude=public/static ${f}
          if [ $? -eq 0 ]; then
            echo "${f}" >> ${dayFile}
            echo "${curtime} ${f} done" >> /web/backup_all.log
          fi
        done
    fi
  done

41.确定运行稳定后,清理原服务器全部数据(数据库及源码文件)

Tags: 笔记

添加新评论