Gitea(吉茶)認證綁定微軟網域主控站

根據官方文件 , 吉茶可以綁定各式各樣的登入認證, 也包含微軟網域主控認證, 但並沒有解釋太多, 因我有需求要綁定Micro$oft 網域主控站 , 因此記錄一下注意事項.


  • 重點在於搞定使用者篩選
# (memberOf=xxx) xxx 為群組名稱 CN=GitGroup,OU=groups,DC=test,DC=com
#  意思就是帳號需隸屬於GitGroup這個群組, 若不需要可以拿掉.
# (mail=*) 代表帳號email屬性必須有值才能用, 若不需要也可以拿掉

(&(objectCategory=Person)(memberOf=CN=GitGroup,OU=groups,DC=test,DC=com)(sAMAccountName=%s)(mail=*)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))
  • 對應帳號屬性與email屬性

  • 若匯入的帳號不喜翻, 可以到資料庫刪除, 再執行作業重新匯入
MariaDB [gitea]> delete from email_address where id<>1;
Query OK, 2 rows affected (0.00 sec)

MariaDB [gitea]> delete from user where id<>1;
Query OK, 2 rows affected (0.00 sec)

解決 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

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;

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

QNap不正常關機, 造成vm開機失敗的修復小心得

一直以來QNap 純粹用來當作儲存設備, 花俏功能我都直接關掉, 只開放iSCSI , NFS 與CIFS , 而且限定內部ip才能連線(Qlocker遠離我).
但是最近公司停電,開機後, 我發現有一個插槽壞了, 換硬碟也顯示無硬碟狀態, 有夠麻煩的, 手忙腳亂了一番, 不小心造成QNap不正常關機(不要笑我啊).

悲劇來了, windows 的主要網域主控站, 與Sharepoint Server直接GG 慘, 而Linux也有狀況例如這個網站也GG, 好險Linux自帶工具, 告訴我可以執行xfs修復, 至少可以開機成功, windows就不多說了, 直接拿備份重建, 但是一波好幾折, 辛酸阿.

先說 linux 的docker server中 mariadb server container也再起不能了, 哭,
於是我另開一個可啟動的 mariadb container , 把有問題的volume中的額外table放到乾淨的mysql目錄中, 想像這樣或許可以救起來其他資料庫, 一開始啟動成功, show database, show tables也看到, 真是高興, 但是要select tables時候, 出現錯誤訊息

mysql error unknown table engine

又哭... 找了好久終於找到可以在my.cnf中加上以下參數, 但是我的container沒有mapping到/etc中的my.cnf , 於是又搞了一次, 才可以進行修復.

innodb_force_recovery = 1 
or 
innodb_force_recovery = 4

終於完成了, 我的網站修復完成.

--- added 2021/5/10 ----

後來發現以上innodb_force_recovery參數只能暫時使用, 需要趕緊使用mysqldump把資料備份下來,

mysqldump --user=root -h 127.0.0.1 --password --lock-tables --databases 資料庫名稱 > xxx.sqlmysqldump --user=root -h 127.0.0.1 --password  --databases 資料庫名稱 > xxx.sql

然後再重新跑一個全新 server 把相關資料倒回去, 才能真正高枕無憂

查詢oracle 11g匯出檔案的字元編碼

最近遇到一個搞笑的烏龍, 公司匯出的oracle dmp檔案, 進行還原測試的時候, 無法匯入到測試區, 錯誤訊息為:

IMP-00037: Character set marker unknown

經過爬文,有可能是字元編碼不一致, 網路上提供的解方是:

 cat xxx.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

這樣可以查出oracle系統的字元編號, 再以字元編號查詢編碼名稱

SQL> select nls_charset_name(to_number('上個指令查出的字元編號','xxxx')) from dual;

這樣的指令應該是可以查出來, 若查不出來就可能是檔案損毀或是我這樣的烏龍,

我匯出備份的時候, 加上tar以及bz2壓縮

所以原檔案變成 xxx.dmp.bz2, 完全看不出來有tar , 因此解壓的時候我忘記了只有解bz2 , 解出來的xxx.dmp 其實不是原本的dmp檔案, 還需要解開tar這個動作, 哈哈

docker 安裝 restyaboard (一種看板軟體)

**安裝前必須先安裝postgres (因為restyaboard是docker安裝, 因此postgres也建議用docker安裝)

也必須先行建立資料庫 restyaboard , 存取的使用者,與密碼 ,

docker run --rm -d -e POSTGRES_DB='restyaboard' \
-e POSTGRES_HOST='postgres' \
--link <docker postgres名稱>:postgres \
-e POSTGRES_PASSWORD='admin' \
-e POSTGRES_USER='admin' \
-p 8080:80 \
--name restyaboard restyaplatform/restyaboard:dev

完成後, 可以http登入8080 ,

輸入預設帳號admin , 密碼restya

docker安裝postgres

安裝很簡單, 預設的管理者帳號是 postgres , 密碼就是底下所設定的密碼

docker volume create postgres-data 
docker run --name postgres -v postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=<密碼> -d postgres

如何登入

docker exec -it postgres  bash

登入後輸入 su - postgres

變身成 postgres之後, 

再下psql 就可以進入postgres世界了

但是指令就很不習慣,只能列出一些剛剛用到的,以後想到再補上

$ sudo -u postgres psql
-- List all databases via \l (or \list), or \l+ for more details
postgres=# \l Name | ... -----------+----------- postgres | ... template0 | ... template1 | ... postgres=# CREATE DATABASE mytest; $ sudo -u postgres createuser --login --pwprompt testuser Enter password for new role: xxxx # Create a new database called testdb, owned by testuser. $ sudo -u postgres createdb --owner=testuser testdb

 

MSSQL的日期(Date)欄位如何加上指定的小時數

公司某天刷臉機器因停電造成時間錯誤, IT人員未即時更新(因為週六), 導致少數加班人員吃飯刷卡紀錄錯誤,少了11小時, 因此必須加回去原本的資料庫 , 可使用 dateadd(hour, 預加或減的小時數字, 欄位名稱) 的方式處理.

update dbo.KQZ_Card set CardTime= dateadd(hour,11,KQZ_card.CardTime) where DevID=9 and year(CardTime)=2019 and Month(CardTime)=4 and day(CardTime)=27;

1 2 3