解決 oracle 11G 出現的ORA-01555 問題

oracle我很不熟, 但在公司使用exp指令備份oracle 11g資料時, 遇到以下錯誤訊息

EXP-00056: ORACLE error 1555 encountered
ORA-01555: snapshot too old: rollback segment number  with name "" too small
ORA-22924: snapshot too old

爬了文, 解法有三, 我從最簡單的解法開始, 第一種,第二種都失敗, 直到第三種方式才成功.
我建議從第三種方式開始解,該方法不需修改系統設定, 影響較小.

  • 方法一
    修改 undo_retention秒數, 把時間拉大,
    **這鬼才知道怎麼知道有用,我是用備份的方式測試, 發現改了之後還是一樣出錯
SQL>  show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     21600
undo_tablespace                      string      UNDOTBS1
SQL> ALTER SYSTEM SET UNDO_RETENTION = 43200;
SQL>
System altered.

SQL>
  • 方法二
    直接加大undo tablespace ,
    這要小心點, 有很多眉角, 似乎牽涉到小心舊undo tablesapce 是否已呈現"OFFLINE", 且新的undo tablespace 呈現"ONLINE'
# 新增undo tablespace 
create undo tablespace UNDOTBS2 datafile '/.../oradata/undotbs02.dbf' size 30000M autoextend on next 100m maxsize unlimited;
#生效
alter system set undo_tablespace = UNDOTBS2 scope=both;

#查看狀態
select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status; 
select status,segment_name from dba_rollback_segs where status not in ('OFFLINE') and tablespace_name='UNDOTBS1';
select tablespace_name, status, count(*) from dba_rollback_segs group by tablespace_name, status;
#確認舊的已是offline , 就可以刪掉舊的
Drop tablespace UNDOTBS1 including contents and datafiles;
#再次查看是否已變成新的undo tablespace
show parameter undo
select tablespace_name tablespace, status, sum(bytes)/1024/1024 sum_in_mb, count(*) counts
from dba_undo_extents
group by tablespace_name, status order by 1,2;
  • 方法三
# 先建立一個資料表, 用來儲存有問題的資料ID(ROWID)
SQL> CREATE TABLE CORRUPTED_ROWS (CORRUPTED_ROWID ROWID, ERROR_NUMBER NUMBER);

Table created.

將有錯誤table的table schema , 欄位類型為clob , blob 欄位列出來, 問題一定在這幾個欄位之中

# 以下紅色部分請改為有問題資料表與欄位名稱, 若沒有出現錯誤, 就換下一個欄位(fieldname)試試看
SET TIMING ON
DECLARE 
   ERROR_1578  EXCEPTION;
   ERROR_1555  EXCEPTION;
   ERROR_22922 EXCEPTION;
   PRAGMA EXCEPTION_INIT(ERROR_1578,  -1578);
   PRAGMA EXCEPTION_INIT(ERROR_1555,  -1555);
   PRAGMA EXCEPTION_INIT(ERROR_22922, -22922);
   N NUMBER;
BEGIN
   FOR ROW IN (SELECT ROWID, fieldname FROM user.table)
   LOOP
      BEGIN
         N:=DBMS_LOB.INSTR(ROW.fieldname, HEXTORAW('889911'));
	  EXCEPTION
         WHEN ERROR_1578  THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 1578);
			  COMMIT;
         WHEN ERROR_1555  THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 1555);
			  COMMIT;
         WHEN ERROR_22922 THEN 
              INSERT INTO CORRUPTED_ROWS VALUES (ROW.ROWID, 22922);
			  COMMIT;
       END;
   END LOOP;
END;
/

接下來查詢是否真有問題資料

SELECT * FROM CORRUPTED_ROWS;
#執行以下這行指令應該要出錯
SELECT fieldname FROM user.table WHERE ROWID IN (SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS);

清空有問題的資料欄位

#若欄位型態是clob就用empty_clob(), 若為blob,就改成empty_blob(), 有幾個欄位出問題就清空幾個
update xxx.table set fieldname = empty_clob()where ROWID IN (SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS);

若不敢清空, 可以跳過有問題的資料備份

exp system@yourinstance BUFFER=81920 file=/tmp/backup.dmp  tables=user.table QUERY=\"WHERE rowid NOT IN \(SELECT CORRUPTED_ROWID FROM CORRUPTED_ROWS\)\"

參考資料

https://www.modb.pro/db/47021

Linux 掛載nfs , cifs (smb) 讓 restic 備份, 遇到備份效率緩慢問題

我已經使用 restic 做離線備份半年了 , 效果還不錯, 但是遇到掛載nfs的資料, 效率就有點差了,
當然備份效率差的原因之一, 是我暴力備份docker or podman 裡面storage 資料, 那邊檔案超級多, 又是透過 nfs 方式備份, 就算restic 每次只做差異性, 還是很慢.

後來想想, 我的虛擬伺服器 proxmox ve 也有遇到掛載nfs效率問題, 解法就是使用soft link, 所以自己使用mount指令掛載nfs應該也是可以改用soft方式, 以下列出一些心得

  • cifs 掛載可用cache=loose
mount -t cifs -o username=xxx,password=xxx,domain=yyy,ro,cache=loose  ...
  • nfs 可用soft
mount -t nfs -o ro,soft ...
#查看
nfsstat -m

升級mail server不支援TLS 1.0 , 1.1的問題

postfix 出現以下錯誤

SSL routines:tls_early_post_process_client_hello:unsupported protocol

我不知道如何處理, 爬文說要改成向下相容... 我才不要勒

vi /etc/crypto-policies/back-ends/opensslcnf.config
#改成
#MinProtocol = TLSv1.2
MinProtocol = TLSv1
MaxProtocol = TLSv1.3

vi /etc/postfix
#確認沒有被限制
# Disable SSLv2, SSLv3, TLSv1, TLSv1.1
#smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
#smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
#smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
#smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

Rocky Linux 安裝httpd 反向代理

真是被selinux搞死,但,咱們工程師, 就是要勇往直前

RL9 安裝httpd後, 若要啟用proxy , reverse 功能 , 目前我遇到要改兩點

  • 修改httpd設定, 把心跳這一行mark起來
    vi /etc/httpd/conf.modules.d/00-proxy.conf
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
  • selinux 啟用連線功能
 sudo setsebool -P httpd_can_network_connect 1

自製郵件伺服器啟動腳本

我用自製的docker版郵件伺服器已經一陣子了, 每次要組合出腳本很麻煩, 我又不喜歡用yaml文件, 因此利用github的免費pages, 自己寫了一個簡易自動產生腳本的網頁, 還滿方便的, 頁面難看就請多包涵.

https://williamfromtw.github.io/docker-Postfix-AD/genLaunchCommand.html

Rocky Linux 9安裝let's Encrypt

dnf install certbot
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
# 申請mail.test.com 憑證
systemctl stop httpd
certbot certonly --standalone --preferred-challenges http -d  mail.test.com

# 若要renew 請加到crontab
certbot renew --post-hook "systemctl restart httpd"

Rocky Linux 9 安裝podman

 dnf install podman container-tools

讓系統自動啟用podman

修改預設儲存路徑(預設是"/var/lib/containers/storage")

mkdir -p /podman/storage
vi /etc/containers/storage.conf

讓selinux開放使用

semanage fcontext -a -e /var/lib/containers/storage /podman/storage
restorecon -R -v /podman/storage/

讓podman 跑起來

systemctl start podman

查看修改的路徑是否生效

podman info

Rocky Linux 9 minimal 安裝後,必須額外安裝的套件

有遇到就加在這裡

#找semanage成是在哪個套件
dnf provides semanage 
dnf install policycoreutils-python-utils
#epel
dnf install epel-release
# CRB
dnf config-manager --enable crb
# net tools include ifconfig
dnf install net-tools
# httpd mod_ssl
dnf install httpd mod_ssl
# git
dnf install git
# sshpass (remote command by ssh )
dnf install sshpass

RockyLinux 9 簡易安裝 mariadb

好久沒安裝mysql了, 我之前都是docker 無腦安裝, 並不需要了解太多, 但是因為我先前安裝的 piwigo docker版本升級不利, 想說手動安裝piwigo看看, 當然第一步就是安裝mariadb囉.

這次RL9預設的mariadb是10.5, 安裝相當簡單

dnf install mariadb-server

接下來就是改密碼,預設console直接可以使用root登入

mysql -p -uroot

跟之前不一樣,我還停留mysql舊時代改密碼方式 update user set password=password('you password') where user='root'
居然失敗了, 爬了文, 反正就是跟上主流,改用oracle類似的變更方式了

alter user root@localhost identified by 'your password';
flush privileges;

很多相關設定可參考原廠文件

1 2 3 ... 12