> For the complete documentation index, see [llms.txt](https://docs.tibero.com/prosync/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/prosync/rollback.md).

# 롤백 가이드

백업이 존재하는 경우에만 롤백이 가능하다. 아래는 4.4.x로의 패치 이후 문제가 발생했을 때, 이전 버전으로 롤백하기 위한 단계다.

### 1. 프로세스 강제 종료 (SRC / TAR)

```bash
ADMIN> shutd agent;
```

### 2. 디렉토리 복구

```bash
rm -rf prosync;
mv old_prosync prosync
```

{% hint style="info" %}
**참고**

**3단계(재설치 수행)**&#xBD80;터 **5단계(메타데이터 복구)**&#xAE4C;지의 과정은 메타 테이블 구조 변경으로 인해 필요한 절차이며, 백업 시점의 버전과 현재 설치된 버전 사이에 메타 테이블 구조 변경이 있는 경우에만 수행한다. 메타 테이블 구조는 4.5.0에서 변경되었으므로 다음 두 경우가 이에 해당한다.

* 4.5.0 이상에서 4.4.x 이하로 내려가는 롤백
* 4.0, FS01, 4.2.x 버전으로의 롤백
  {% endhint %}

### 3. 재설치 수행

```bash
$PRS_HOME/install/prs_install.sh -c prs_install.cfg
```

### 4. 기존 메타데이터 삭제

{% hint style="warning" %}
**주의**

4단계와 5단계에 나열된 메타 테이블 목록은 **백업 시점 버전(구버전)의 스키마**를 기준으로 한 것이므로, 현재 설치된 버전의 테이블 목록으로 바꾸면 절차가 깨진다. 백업 스크립트(`prs_backup.sh`)가 구버전의 `create_src_tbl.sql`을 기준으로 백업 테이블을 생성하고, 5단계의 `INSERT ... SELECT *`는 원본 테이블과 백업 테이블의 컬럼 구성이 동일해야 성공하기 때문이다. 따라서 현재 버전에는 없고 구버전에만 존재하는 테이블(예: `PRS_IMPORTED_ARCHIVE_LOG`)이 목록에 포함되어 있어도 그대로 둔다.
{% endhint %}

#### SRC DB

```sql
TRUNCATE TABLE $PRS_USER.PRS_TXINFO;
TRUNCATE TABLE $PRS_USER.PRS_OBJ_LIST;
TRUNCATE TABLE $PRS_USER.PRS_DDL_HIST;
TRUNCATE TABLE $PRS_USER.PRS_DD_CON;
TRUNCATE TABLE $PRS_USER.PRS_DD_ENC;
TRUNCATE TABLE $PRS_USER.PRS_DUMMY_TBL;
TRUNCATE TABLE $PRS_USER.PRS_LOGMNR_INFO;
TRUNCATE TABLE $PRS_USER.PRS_IMPORTED_ARCHIVE_LOG;
TRUNCATE TABLE $PRS_USER.PRS_DD_ETL_HIST;
TRUNCATE TABLE $PRS_USER.PRS_DICT_HIST;
TRUNCATE TABLE $PRS_USER.PRS_DD_USR;
TRUNCATE TABLE $PRS_USER.PRS_DD_TBL;
TRUNCATE TABLE $PRS_USER.PRS_DD_SGMT;
TRUNCATE TABLE $PRS_USER.PRS_DD_COL;
TRUNCATE TABLE $PRS_USER.PRS_IPARAM;  -- Rule DB를 사용한 구성에서만 해당한다. 해당 테이블이 없으면 건너뛴다.
```

#### TAR DB

```sql
TRUNCATE TABLE $PRS_USER.PRS_CONST_HIST;
TRUNCATE TABLE $PRS_USER.PRS_LCT;
TRUNCATE TABLE $PRS_USER.PRS_DUMMY_TBL;
TRUNCATE TABLE $PRS_USER.PRS_COMMITTED_TX_LIST;
TRUNCATE TABLE $PRS_USER.PRS_INSTALL_HIST;
```

### 5. 메타데이터 복구

#### SRC DB

```sql
INSERT INTO $PRS_USER.PRS_TXINFO SELECT * FROM prs_backup.PRS_TXINFO;
INSERT INTO $PRS_USER.PRS_OBJ_LIST SELECT * FROM prs_backup.PRS_OBJ_LIST;
INSERT INTO $PRS_USER.PRS_DDL_HIST SELECT * FROM prs_backup.PRS_DDL_HIST;
INSERT INTO $PRS_USER.PRS_DD_CON SELECT * FROM prs_backup.PRS_DD_CON;
INSERT INTO $PRS_USER.PRS_DD_ENC SELECT * FROM prs_backup.PRS_DD_ENC;
INSERT INTO $PRS_USER.PRS_LOGMNR_INFO SELECT * FROM prs_backup.PRS_LOGMNR_INFO;
INSERT INTO $PRS_USER.PRS_IMPORTED_ARCHIVE_LOG SELECT * FROM prs_backup.PRS_IMPORTED_ARCHIVE_LOG;
INSERT INTO $PRS_USER.PRS_DD_ETL_HIST SELECT * FROM prs_backup.PRS_DD_ETL_HIST;
INSERT INTO $PRS_USER.PRS_DICT_HIST SELECT * FROM prs_backup.PRS_DICT_HIST;
INSERT INTO $PRS_USER.PRS_DD_USR SELECT * FROM prs_backup.PRS_DD_USR;
INSERT INTO $PRS_USER.PRS_DD_TBL SELECT * FROM prs_backup.PRS_DD_TBL;
INSERT INTO $PRS_USER.PRS_DD_SGMT SELECT * FROM prs_backup.PRS_DD_SGMT;
INSERT INTO $PRS_USER.PRS_DD_COL SELECT * FROM prs_backup.PRS_DD_COL;
INSERT INTO $PRS_USER.PRS_IPARAM SELECT * FROM prs_backup.PRS_IPARAM;  -- Rule DB를 사용한 구성에서만 해당한다. 해당 테이블이 없으면 건너뛴다.
```

```sql
DELETE FROM PRS_DD_CON
 WHERE (DD_SEQ#, BO_ID) IN (
       SELECT DD_SEQ#, OBJ_ID FROM PRS_DD_TBL
        WHERE OWNER = '$PRS_USER' AND NAME = 'PRS_DUMMY_TBL');
DELETE FROM PRS_DD_COL
 WHERE (DD_SEQ#, BO_ID) IN (
       SELECT DD_SEQ#, OBJ_ID FROM PRS_DD_TBL
        WHERE OWNER = '$PRS_USER' AND NAME = 'PRS_DUMMY_TBL');
DELETE FROM PRS_DD_SGMT
 WHERE (DD_SEQ#, BO_ID) IN (
       SELECT DD_SEQ#, OBJ_ID FROM PRS_DD_TBL
        WHERE OWNER = '$PRS_USER' AND NAME = 'PRS_DUMMY_TBL');
DELETE FROM PRS_DD_ENC
 WHERE OBJ_ID IN (
       SELECT OBJ_ID FROM PRS_DD_TBL
        WHERE OWNER = '$PRS_USER' AND NAME = 'PRS_DUMMY_TBL');
DELETE FROM PRS_DD_TBL
 WHERE OWNER = '$PRS_USER' AND NAME = 'PRS_DUMMY_TBL';
COMMIT;

DECLARE
  v_seq NUMBER;
BEGIN
  v_seq := PRS_DD_META.INSERT_HIST(0, 'refresh PRS_DUMMY_TBL dd only');
  PRS_DD_META.UPDATE_TBL(v_seq, '$PRS_USER', 'PRS_DUMMY_TBL', NULL, NULL);
  PRS_DD_META.UPDATE_HIST(v_seq, 1, NULL);
END;
/
COMMIT;
```

#### TAR DB

```sql
INSERT INTO $PRS_USER.PRS_CONST_HIST SELECT * FROM prs_backup.PRS_CONST_HIST;
INSERT INTO $PRS_USER.PRS_LCT SELECT * FROM prs_backup.PRS_LCT;
INSERT INTO $PRS_USER.PRS_COMMITTED_TX_LIST SELECT * FROM prs_backup.PRS_COMMITTED_TX_LIST;
INSERT INTO $PRS_USER.PRS_INSTALL_HIST SELECT * FROM prs_backup.PRS_INSTALL_HIST;
```

{% hint style="warning" %}
**주의**

복구 후 반드시 COMMIT을 수행해야 한다.
{% endhint %}

{% hint style="info" %}
**참고**

* `$PRS_USER.PRS_DUMMY_TBL`에 대해서는 INSERT 작업을 진행하지 않는다.
* `prosync` 롤백 과정에서 재설치가 수행되는데 이 때 `$PRS_USER.PRS_DUMMY_TBL`은 재설치 과정에서 `obj_id`가 변경되는 경우가 발생하여 `$PRS_USER.PRS_DUMMY_TBL`에 대해 `dd image` 갱신 작업을 수행해야 한다.
  {% endhint %}

### 6. Config 파일 검토 및 수정

각 설정 파일의 파라미터를 기존 설정과 비교하여 알맞게 수정한다.

* `<$instance_ID>_ext#.cfg`
* `<$instance_ID>_apply1.cfg`
* `<$instance_ID>_llob1.cfg`
* `prs_agent_<$Agent_ID>.cfg` → `prs_mgr.cfg`
* `prs_instance.map` → `prs_top.map`

### 7. ProSync 재기동

```bash
ADMIN> start man {AGENT_ID}
ADMIN> start {INSTANCE_ID}
```
