求助:基于GitLab自动化实现12c Oracle目录Windows到Linux迁移方案
Oracle Windows到Linux目录迁移自动化方案
核心实现逻辑
- 目录映射解析:提取Windows目录的相对结构,替换盘符为Linux根挂载点
/mount/DBDIR/,完成路径格式转换 - 目标目录预创建:在Linux服务器自动生成对应目录结构,配置符合Oracle DBA要求的权限
- 增量数据同步:采用跨平台同步工具实现文件增量迁移,减少重复传输开销
- 迁移验证:校验文件数量、大小一致性,确保数据完整无遗漏
GitLab流水线配置示例
stages: - prepare - sync - verify # Windows Runner生成目录映射并传递到Linux prepare_dir_mapping: stage: prepare tags: - windows-runner script: - | $sourceDirs = @( "E:\Folder1", "E:\Folder1\Folder1.1", "E:\Folder2", "E:\Folder1\Folder1.1\Folder1.1.1", "E:\Folder2\Folder2.1", "F:\Folder3" ) $mappingFile = "dir_mapping.txt" Remove-Item $mappingFile -ErrorAction SilentlyContinue foreach ($dir in $sourceDirs) { # 转换Windows路径为Linux格式 $linuxDir = $dir -replace "^[A-Z]:\\", "/mount/DBDIR/" -replace "\\", "/" Add-Content $mappingFile "$dir|$linuxDir" } # 上传映射文件到Linux目标机 scp $mappingFile oracle@linux-azure-host:/tmp/ artifacts: paths: - dir_mapping.txt # Linux Runner创建目标目录并配置权限 create_linux_dirs: stage: prepare tags: - linux-runner script: - | while IFS='|' read -r winDir linuxDir; do sudo mkdir -p "$linuxDir" sudo chown -R oracle:oinstall "$linuxDir" sudo chmod -R 750 "$linuxDir" # 对Dump文件设置更严格权限 find "$linuxDir" -name "*.dmp" -exec chmod 600 {} \; done < /tmp/dir_mapping.txt # 跨平台数据同步(基于rsync) sync_data: stage: sync tags: - windows-runner script: - | # 需提前在Windows端安装cwRsync while IFS='|' read -r winDir linuxDir; do # 转换Windows路径为cwRsync识别的格式 $winRsyncPath = "/cygdrive/${winDir:0:1}/${winDir:3}" -replace "\\", "/" rsync -avz --delete "$winRsyncPath" oracle@linux-azure-host:"$linuxDir" done < dir_mapping.txt # 迁移结果验证 verify_sync_result: stage: verify tags: - linux-runner script: - | while IFS='|' read -r winDir linuxDir; do # 远程统计Windows端文件数 winFileCount=$(ssh windows-azure-host "powershell -Command '(Get-ChildItem -Recurse \"$winDir\" -File | Measure-Object).Count'") # 统计Linux端文件数 linuxFileCount=$(find "$linuxDir" -type f | wc -l) if [ "$winFileCount" -ne "$linuxFileCount" ]; then echo "错误:$winDir 与 $linuxDir 文件数量不一致" exit 1 fi # 校验文件总大小 winTotalSize=$(ssh windows-azure-host "powershell -Command '(Get-ChildItem -Recurse \"$winDir\" -File | Measure-Object -Property Length -Sum).Sum'") linuxTotalSize=$(du -sb "$linuxDir" | awk '{print $1}') if [ "$winTotalSize" -ne "$linuxTotalSize" ]; then echo "错误:$winDir 与 $linuxDir 文件总大小不一致" exit 1 fi done < /tmp/dir_mapping.txt echo "所有目录迁移验证通过"
关键脚本扩展说明
Windows端自动扫描目录脚本(PowerShell)
如果需要自动识别盘符下的DBA目录,可替换手动指定的目录列表:
$targetDrives = @("E:", "F:") $mappingFile = "dir_mapping.txt" Remove-Item $mappingFile -ErrorAction SilentlyContinue foreach ($drive in $targetDrives) { # 扫描盘符下所有子目录(可添加过滤规则,比如匹配特定命名的目录) Get-ChildItem -Path $drive -Directory -Recurse | ForEach-Object { $winDir = $_.FullName $linuxDir = $winDir -replace "^[A-Z]:\\", "/mount/DBDIR/" -replace "\\", "/" Add-Content $mappingFile "$winDir|$linuxDir" } }
实操注意事项
- 工具依赖:Windows端需安装
cwRsync和OpenSSH组件,Linux端确保rsync服务正常运行 - 权限配置:GitLab Runner用户需拥有Windows目录读取权限、Linux服务器SSH sudo权限
- 增量策略:
rsync的--delete参数会删除Linux端冗余文件,若需保留历史数据可移除该参数 - 网络优化:Azure环境优先使用VNet内网同步,避免公网带宽瓶颈
- DDL适配:可在流水线中添加
expdp/impdp步骤,完成Oracle对象的CDB-PDB架构迁移
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

