Client copy出错

在进行ClientCopy过程中遇到Oracle回滚段空间不足导致错误,通过调整操作系统设置及Oracle数据库配置解决了问题。

在上篇文章中,我已经说明了,我的Client Copy没有成功,中途出错退出了。出错画面如下:

image 

我从头看到尾,没怎么看明白,好象是说ORACLE的rollback segment不够造成一个SQL error。

解决方案中让我找database administrator来处理这个问题,可是这是我自己的IDES,我检查了硬盘空间,不管是虚拟机的硬盘还是我真实的硬盘,都有很大的剩余容量,看来不应该是容量不够造成的。那是什么原因呢?

我在网上搜了下,找到一个博客,里面描述的内容与我出现的问题是一样的。很遗憾,由于我对ORACLE不懂,也不知他博客中的解决方法在哪里设置,只得不了了之。但还是把他的文章内容转载在此,留个记录。文中加粗的部分是我认为他解决这个问题的方法,但我却不知如何去作。唉,这层窗户纸不知何时能破。

http://blog.sina.com.cn/s/blog_5409b562010003qm.html

IDES 800的数据太多了,做一个Client Copy,需要处理27000多个表,可能会又7、8千万左右的数据量!因为目前进度50%不到,Copied Lines是26,030,610,Deleted Lines是3,407,922。没办法,想以800为基础,参照Help Online学习,又怕把这个Client给弄的跑不下去。

昨天用的前台跑,运行不多久,大概处理了6000多个表,1千万左右数据的时候,就出错了,大致是说Oracle回滚段空间不够。具体信息如下:

Runtime errors DBIF_RSQL_SQL_ERROR
Exception CX_SY_OPEN_SQL_DB
Occurred on 16.05.2006 at 22:52:50

>> Short dump has not been completely stored. It is too big.

An SQL error occurred when accessing a table.

What happened?

For this operation, the ORACLE instance needed additional
storage space in a rollback segment.
The expansion of this rollback segment failed.

What can you do?

You cannot eliminate this error yourself.
Please inform your database administrator.
Make a note of the actions and input which caused the error.
-

To resolve the problem, contact your
SAP system administrator.

With transaction ST22, for dump analysis, you can see and manage
termination messages and, in particular, save them for longer periods of
time.

Make a note of the actions and input which caused the error.

用ST22查看dump日志,很多地方看不懂,内容又太多,大致的找了下,没有发现具体是在哪个表或者哪个数据库实例上出的错。对Oracle也不懂,所以只能乱整一顿之后,重新开始。

首先开了操作系统的3GB开关并重启机器,然后把Oracle中IDES数据库的所有数据文件、回滚段文件增长设置为"不限制",尤其是带有System和Temp单词的那些数据文件。扩大了Temp数据文件的初始大小,因为原来好像才几十M的样子,感觉太小了,并且好像还是设置为不允许自动增长,估计问题也就是出在这吧,记得后来是把Temp数据文件初始大小设置为了10G。可怜那个硬盘,80G左右的空间,这样一折腾之后,已经所剩无几了。Copy完成之后,数据库的设置再调整回去,应该还可以节省不少的空间出来。

现在用Background的方式在运行,用SCC3查看,进度正常。重新开始Client Copy的时候,是从昨天出错的位置开始的,也节约了不少时间。

好了,目前已经处理了20000个表了,还剩7000个,估计不会再有问题了。估计也就是财务的FI/CO部分的表,数据量比较大(IDES里面800为Central FI Syst),现在表的处理速度已经很快了。

纪念一下

注意,Client Copy完成之后,Target Client中的所有用户、密码设置,就和Source Client中完全一样了。例如我Copy 800到100,之前100中SAP*的密码为pass,Copy之后,SAP*的密码变为800中的06071992。

# =========================================================================== # 第二部分:夹具系统(Fixtures) - 测试资源管理中枢 # =========================================================================== """ ⚙️ 夹具定位:测试资源的"智能管家" Fixture 是 pytest 的核心功能之一,用于: - 提供测试所需资源(如客户端、数据库连接) - 管理资源生命周期(setup/teardown) - 提高代码复用性、可维护性 """ # ---------------------------------- # 2.1 基础夹具模式 # ---------------------------------- @pytest.fixture def api_client(): """ 🛠️ 通用API客户端(函数级作用域) - 返回一个包含基础URL的字典 - 可供多个测试函数复用 - 每次测试函数调用都会创建一个新的实例 """ return {"base_url": "http://127.0.0.1:5000"} def test_with_client(api_client): """ ✅ 夹具自动注入演示 - api_client 是通过 fixture 提供的 - 自动注入到测试函数中 - 用于发送GET请求验证服务是否运行 """ response = requests.get(f"{api_client['base_url']}/get") assert response.status_code == 200 # ---------------------------------- # 2.2 进阶夹具技巧(适配本地服务) # ---------------------------------- @pytest.fixture(scope="module") def auth_token(api_client): """ 🔐 模拟认证令牌(模块级夹具) - scope="module":整个测试模块共享一个实例 - 模拟认证流程,返回一个模拟的 token - 用于后续需要认证的测试 """ return "simulated_token_12345" @pytest.fixture def authenticated_client(api_client, auth_token): """ 🔒 带认证的客户端(组合夹具) - 组合使用 api_client 和 auth_token - 添加 Authorization 请求头 - 用于需要认证的接口测试 # 🧠 拷贝知识(零基础必读) ## 浅拷贝(当前使用) client = api_client.copy() → 创建新对象,但仅复制第一层内容 ✔️ 优点:速度快,内存占用小 ✔️ 适用场景:对象只有简单属性(如当前只有headers) ❌ 风险:若对象包含嵌套结构(如headers里有字典),内层数据仍共享 ## 深拷贝(备选方案) import copy client = copy.deepcopy(api_client) → 完全独立的新对象 ✔️ 优点:彻底隔离,绝对安全 ❌ 缺点:速度慢,内存消耗大 ✔️ 适用场景:对象有多层嵌套数据(如配置字典含子字典) # 当前选择浅拷贝的原因: 1. api_client通常是简单结构(如 {base_url, headers}) 2. headers属性我们直接覆盖替换,不修改原有内容 3. 高性能需求(测试执行速度优先) """ # 创建新对象(隔离原始api_clientclient = api_client.copy() # 📌 浅拷贝操作 # 添加认证头(不影响原始api_clientclient["headers"] = {"Authorization": f"Bearer {auth_token}"} return client # =========================================================================== # 测试用例(展示实际调用流程) # =========================================================================== def test_public_api(api_client): """🌐 测试公共API(无需认证) 输出: [创建API客户端] → 函数级作用域(每个测试独立) [测试1] 调用公共API 使用客户端: {'base_url': 'http://127.0.0.1:5000'} """ print("\n[测试1] 调用公共API") print(f" 使用客户端: {api_client}") assert "base_url" in api_client def test_private_api1(authenticated_client): """🔒 测试私有API1(需要认证) 输出: [创建API客户端] → (新实例) === 生成认证令牌 === → (首次调用模块级夹具) 使用API客户端: http://127.0.0.1:5000 [构建认证客户端] → 原始API客户端ID: 140000000 | 新客户端ID: 140000001 [测试2] 调用私有API1 认证客户端: {'base_url': 'http://127.0.0.1:5000', 'headers': {...}} """ print("\n[测试2] 调用私有API1") print(f" 认证客户端: {authenticated_client}") assert "headers" in authenticated_client def test_private_api2(authenticated_client): """🔒 测试私有API2(需要认证) 输出: [创建API客户端] → (新实例) [构建认证客户端] → (重用auth_token) 原始API客户端ID: 140000002 | 新客户端ID: 140000003 [测试3] 调用私有API2 认证客户端: {'base_url': 'http://127.0.0.1:5000', 'headers': {...}} """ print("\n[测试3] 调用私有API2") print(f" 认证客户端: {authenticated_client}") authenticated_client["test_flag"] = True # 修改副本 def test_public_api_again(api_client): """🌐 再次测试公共API(验证状态隔离) 输出: [创建API客户端] → (全新实例) [测试4] 再次调用公共API 原始API客户端状态: {'base_url': 'http://127.0.0.1:5000'}(无test_flag) """ print("\n[测试4] 再次调用公共API") print(f" 原始API客户端状态: {api_client}") assert "test_flag" not in api_client # 验证隔离性 这是我的课件 去讲夹具的,我觉得例子不具有代表意义,尼需要说用与不用的区别,才能体现出为什么要用夹具,要求放在一个py文件中
最新发布
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值