Thứ Năm, 31 tháng 12, 2020

ORA-00959: Tablespace '_$deleted$11$0' Does Not Exist - During DML/DDL On Partitioned Table

Khi thao tác DML, DDL (ví dụ khi add partition báo lỗi): '_$deleted$11$0, cụ thể khi thao tác:
Kịch bản bị lỗi:
  • Một vùng bảng mới đã được tạo
  • Các đối tượng đã được chuyển đến tablespacce
  • Tablespacce đã bị xóa
  • Tablespacce mới đã được đổi tên để có cùng tên với tablespacce ban đầu đã bị loại bỏ
  • DML chống lại một bảng được phân vùng không thành công với ORA-00959
  • Thêm partition mới vào bảng partition không thành công với ORA-00959

Các câu lệnh hay dùng để kiểm tra database DB2, alert log, monitor, kill

Check DB

ps -ef |grep sysc

[Tóm tắt] Thủ tục dựng Oracle DatataGuard RAC 11g bằng backup/recovery

Thông tin máy chủ

 

IP

Db name

db_unique_name

instance_name

Primary

192.168.10.51

dbavn

dbavn

dbavn1

Primary

192.168.10.54

dbavn

dbavn

dbavn2

Stanby

192.168.100.149

dbavn

dbavndg

dbavndg1

Stanby

192.168.100.150

dbavn

dbavndg

dbavndg2

 

Drop Tablespace - Những câu lệnh cần check kỹ trước khi drop

Trước khi drop tablespace cần check kỹ những object sau nhé anh/em cẩn thận phải restore lại thì "ỐM":

Thứ Tư, 30 tháng 12, 2020

Kubernetes là gì?

Bài viết này sẽ giới thiệu rõ Kubernetes (k8s) là gì và cũng đồng thời cho bức tranh tổng quan về nhiệm vụ của Kubernetes nói riêng hoặc Container Scheduler nói chung.

1. Thế nào là Container Scheduler?

Container là gì?

Trong các năm gần đây, thuật ngữ container trong giới CNTT trở nên "hot" hơn bao giờ hết nhất là khi Docker hoặc Kubernetes chiếm đa số các chủ đề thảo luận tại các hội thảo về công nghệ, bài viết này sẽ cho các bạn hiểu chi tiết hơn về thuật ngữ này.

1. Container là gì?

Grep command trong linux, Unix

Lệnh grep được sử dụng để tìm kiếm văn bản. Nó tìm kiếm tệp nhất định cho các dòng có chứa kết quả khớp với các chuỗi hoặc từ đã cho. Đây là một trong những lệnh hữu ích nhất trên Linux và hệ thống giống Unix.

Kỹ thuât Partitioning trong MySQL

Mysql Partitioning theo đúng như tên của nó là việc phân chia một table thành những phần nhỏ theo một logic nhất định, được phân biệt bằng key, key này thường là tên column trong table.

Chủ Nhật, 27 tháng 12, 2020

Backup và Recovery của Container Database (CDB) và Pluggable Database (PDB) trong Oracle Database 12c/18c/19c/21c

NỘI DUNG
1. KẾT NỐI TỚI RMAN
2. BACKUP
Container Database (CDB) Backup
Root Container Backup
Pluggable Database (PDB) Backup
Tablespace và Datafile Backups
Archived Redo Log Backups

3. RECOVERY ĐẦY ĐỦ
Root Container Complete Recovery
Pluggable Database (PDB) Complete Recovery
Tablespace and Datafile Complete Recovery

4. POINT IN TIME RECOVERY (PITR) (KHÔNG ĐẦY ĐỦ)
Container Database (CDB) Point In Time Recovery (PITR)
Pluggable Database (PDB) Point In Time Recovery (PITR)
Table Point In Time Recovery (PITR) in PDBs

1. KẾT NỐI TỚI RMAN
Kết nối tới root container trong CDB với quyền "AS SYSDBA":
$ export ORAENV_ASK=NO
$ export ORACLE_SID=cdb1
$ . oraenv
The Oracle base remains unchanged with value /u01/app/oracle
$ export ORAENV_ASK=YES

$ rman target=/
Recovery Manager: Release 12.1.0.1.0 - Production on Sun Dec 22 17:03:20 2013

Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

connected to target database: CDB1 (DBID=797615285)

RMAN>

Thứ Bảy, 12 tháng 12, 2020

Tự động Add partition cho bảng

Vấn đề: Đối với các bảng dữ liệu có đánh partition theo tháng hoặc theo ngày, người DBA thường xuyên phải đánh partition, nếu quên dữ liệu insert vào sẽ bị lỗi và có thể dẫn đến lỗi toàn hệ thống.

– Giải pháp: Để giải quyết vấn đề trên ta thường viết thủ tục đánh partition tự động cho bảng và đặt scheduler để chạy định kỳ. Việc đánh partition không ảnh hưởng tới các thao tác insert, select, update, delete.

Bí quyết move partition bảng Core tối thiểu thời gian downtime trong Oralce Database

Mục đích: Với bảng core khi move partition mà không rebuild luôn index partition làm cho các câu lệnh Insert, update, delete sẽ bị lỗi, câu lệnh select thì sẽ bị quét full do đó với bảng Core các bạn cần chú ý khi move 1 partition thì phải rebuild index luôn và check luôn unusable nhé.

1. Script sinh câu lệnh:
select 'alter table '||table_owner||'.'||table_name||' move partition '||partition_name|| ' tablespace ' || substr(partition_name,1,8) ||'_RW nologging parallel 4;', partition_name, tablespace_name 
from dba_tab_partitions
where table_owner='BINH_OWNER' and table_name = 'TAB1' and partition_name like 'DATA2014%'
union
select 'alter index '||index_owner||'.'||index_name||' rebuild partition '||partition_name
|| ' tablespace INDX' || substr(partition_name,5,4) || '_RW nologging parallel 4 online;', partition_name, tablespace_name 
from dba_ind_partitions
where index_name in
    (select index_name from dba_indexes where
    table_owner='BINH_OWNER' and table_name = 'TAB1')
    and partition_name like 'DATA2014%'
union
select 'alter index '||owner||'.'||index_name||' noparallel;', null, null from dba_indexes where
table_owner='BINH_OWNER' and table_name = 'TAB1'
order by 2, 1 desc, 3;

2. Copy vào TOAD hoặc SQL Navigator để chạy .
 
3. Check lại:
select * from dba_ind_partitions where status='UNUSABLE';

KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH: 📧 Mail: binhoracle@gmail.com ☎️ Mobile: 0902912888 ⚡️ Skype: tranbinh48ca 👨 Facebook: https://www.facebook.com/BinhOracleMaster 👨 Inbox Messenger: https://m.me/101036604657441 (profile) 👨 Fanpage: https://www.facebook.com/tranvanbinh.vn 👨 Inbox Fanpage: https://m.me/tranvanbinh.vn 👨👩 Group FB: https://www.facebook.com/groups/OracleDBAVietNam 👨 Website: http://www.tranvanbinh.vn 👨 Blogger: https://tranvanbinhmaster.blogspot.com 🎬 Youtube: http://bit.ly/ytb_binhoraclemaster 👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi 👨 Linkin: https://www.linkedin.com/in/binhoracle 👨 Twitter: https://twitter.com/binhoracle 👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội #OracleTutorial #OracleDBA #OracleDatabaseAdministration #học oracle database #oca #ocp #oce #ocm

Thứ Năm, 10 tháng 12, 2020

Cách tạo FUNCTION INDEX trong Oracle Database


1. Tạo index tăng tốc độ truy vấn tên nhân viên:
Câu lệnh:
SELECT * FROM emp WHERE UPPER(emp_name) LIKE 'JOH%';

Tạo index:
CREATE INDEX idx ON emp (UPPER(emp_name));

Câu lệnh
SELECT id, geo, area(geo), desc
     FROM rivers     
     WHERE area(geo) >5000

Tạo index:
CREATE INDEX area_index ON rivers (area(geo));

Cơ chế làm việc của Index trong Oracle Database

B-Tree indexes (sau đây gọi là index) là một object có cấu trúc, chúng ta có thể coi nó như là 1 table cũng được. Tuy nhiên chúng được sắp xếp theo dạng B-Tree (cây nhị phân) để phục vụ cho việc tìm kiếm nhanh. Nó bao gồm các thông tin sau: 

- Index key: chứa các trường dữ liệu làm key khi tạo index 

- RowID: là ROWID tương ứng với dòng dữ liệu chứa index key. 

[VIP] Bí quyết cập nhật các table, package core của Database Core_Kill all

--1.Khoá các user dang open (tru SYS%, %GGATE) luu lai thành scrip lock_user.sql
select 'alter user ' || username || ' account lock;' from DBA_USERS 
where account_status='OPEN' 
and username not in ('SYS','SYSTEM','SYSMAN','GGATE','GOLDENGATE') order by username;

[VIP] Bí quyết cập nhật table, package core của DB lớn_Kill ít nhất

Mục đích:
Cập nhật bảng hoặc package Core của DB Core tránh ảnh hưởng nhất (kill ít nhất)

Thủ tục:
--Kiểm tra các session gọi vào (thường rất nhiều > 100-1000)

select distinct owner from gv$access where lower(object) like lower('%test_package%');

--1. Check số lượng package invalid

select 'ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;' from dba_objects 
where object_type in ('PROCEDURE','FUNCTION','TRIGGER','PACKAGE') and status like 'INVALID' and OWNER like 'TEST_OWNER'
UNION ALL
select 'ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;' from dba_objects
where object_type in ('PACKAGE BODY') and status like 'INVALID' and OWNER like 'TEST_OWNER'

Thứ Tư, 9 tháng 12, 2020

Cài đặt Oracle Database 11gR2 RAC trên Oracle Linux 6.3 sử dụng VirtualBox

Bài viết này mô tả cài đặt Cơ sở dữ liệu Oracle 11g phiên bản 2 (11.2.0.3 64-bit) RAC trên Linux (Oracle Linux 6.3 64-bit) sử dụng VirtualBox (4.2.6) mà sử dụng virtual box disk làm đĩa chia sẻ chung (không cần SAN chung)

Thứ Ba, 8 tháng 12, 2020

Quản trị cơ sở dữ liệu (Database Administrator) và con đường phát triển của DBA

Quản trị cơ sở dữ liệu

Ảnh: solutionfactory.in

Ngày nay khó có thể tưởng tượng hệ thống IT nào hoạt động mà không có cơ sở dữ liệu (CSDL). Vậy làm thế nào để các cơ sở dữ liệu luôn luôn sẵng sàng và trong trạng thái tốt nhất cho người sử dụng truy cập? Ai là người sẽ đảm bảo việc đó? Với bài viết này bạn sẽ hiểu hơn về việc quản trị cơ sở dữ liệu cùng những vui buồn của nghề này.

Thứ Hai, 7 tháng 12, 2020

Xóa archive log sử dụng RMAN trong Oracle Database

% rman TARGET /       # operating system authentication
% rman TARGET SYS@prod NOCATALOG  # RMAN prompts for SYS password
% rman TARGET / CATALOG rco@catdb # RMAN prompts for rco password

Thứ Sáu, 4 tháng 12, 2020

Tối ưu hóa cấu trúc Cơ sở dữ liệu Oracle

Mục đích

- Tối ưu cấu trúc bảng, index, partition.

- Tối ưu câu lệnh truy vấn và tác động của Database

- Tối ưu việc xử dụng tài nguyên của Database

- Đảm bảo database hoạt động ổn định

- Thống nhất phương án thiết kế Database và tác động Database

Thứ Tư, 2 tháng 12, 2020

Bật, tắt DB2

----- Truoc khi restart -----
may 8:
su - db2inst2
db2 list active databases
db2 deactivate database <db_name>
db2 force application all

Phân biệt giữa OLTP và OLAP

 Trong việc phát triển cơ sở dữ liệu quan hệ thường có hai chiến lược chính là OLTP (On-line transactional processing) và OLAP (On-line analytical processing). Vậy chúng là gì, giống nhau và khác nhau như thế nào? Chúng ta hãy cùng tìm hiểu thông qua một hệ thống thực.

Thứ Ba, 1 tháng 12, 2020

Quy trình kiểm tra server Sun Oracle

Kiểm tra các warning messages:
        #grep -i warning /var/adm/messages* 
Kiểm tra các error messages
        #grep -i error /var/adm/messages* 

Cấu hình chặn IP với TCP_WRAPPER

1. Tạo 2 file
vi /etc/hosts.allow

ALL:192.168.1.38 #CRM
sshd:192.168.1.235 #BINHTV_VPN
imapd : 192.168.54.0/255.255.255.0
in.ftpd: 192.168.54.0/255.255.255.0
sshd : 192.168.54.2 172.16.234.4
vsftpd: 192.168.2.*

Cài đặt, cấu hình IPFilter trong Solaris


1. Enable/disable IPFilter:

# svcs -a | grep ipf
# svcadm enable network/ipfilter
# svcadm disable network/ipfilter
# svcadm restart network/ipfilter

Quản lý file, folder trong Solaris

Quản lý File, thư mục
        • Xem danh sách các file : ls
• # ls –l /
• Một số option thường dùng với lệnh ls

-L
Hiển thị danh sách file (chỉ hiện thị tên)
-l
Hiển thị danh sách file (gồm nhiều cột: filename, size,date….)
-a
Liệt kê tất cả các file, bao gồm những file ẩn
-R
Liệt kê tất cả các file kể cả các file trong thư mục con

Các câu lệnh quản lý mạng trong Solaris

Show installed NIcs: 
--Ban 11
#dladm show-link

# dladm show-dev

Quản lý Process trong Solaris

Fuser -cu /s04 Check các process đang truy xuất vào vùng /s04
1. ĐN
- Process: là các tiến trình chạy service. Khi client kết nối đến mới hiển thị process qua lệnh
# ps -ef |grep "ssh"
# ps -ef |grep "ftp"

Quản lý user, group trong Solaris

  1. User

  1. Set biến môi trường

# source /etc/profile -- Chạy biến môi trường ngay lập tức (AD khi thay đổi trong profile muốn chạy luôn)

# . /etc/profile

 

-- Bien môi trường user

~/.bash_profile

Quản lý QFS: Add/thu hồi đĩa vào cluster

I. Add drive disk vào cluster 
Scan disk mới trên các node:
devfsadm -C
Kiểm tra trước khi thực hiện add drive disk:
# cldevice list -v
Thực hiện lệnh sau để update global device trên cả 2 node:
# cldevice populate
Kiểm tra sau khi thực hiện add drive disk:
# cldevice list -v

Quản lý NFS trong Solaris, Linux

Cách mount NFS 1 phân vùng từ Solaris sang Linux hoặc Solaris khác

1. Source (Solaris1, UFS,):
- Mount phân vùng ufs /s01 thông tin trong /etc/vfstab
  /dev/md/dsk/d10 /dev/md/rdsk/d10        /bk  ufs     2       yes     -
- Share NFS quyen read write
#  share -F nfs -o rw /bk
(192.168.1.25 là IP của máy Solaris1)

Quản lý UFS trong Solaris

  1. Check

-- Check phân vùng đã được mount

# cat /etc/vfstab

/dev/dsk/c7t60060E801663D800000163D800000401d0s0        /dev/rdsk/c7t60060E801663D800000163D800000401d0s0   /s03 ufs     2   yes

Quản lý ZFS File System trong Solaris

1. Mục đích

Ứng dụng chạy zfs dùng cache từ RAM --> Ứng dụng chạy nhanh

Quản lý dịch vụ trong Solaris

  • Service: dịch vụ chạy (các service như POP3, SMTP, SSH, Telnet, DNS, … và các service để hệ thống có thể chạy được); một service có thể có 1 hoặc nhiều process. 


Check service

1 chương trình có thể có nhều process: database oracle có nhiều process

# svcs -a |more   // Liệt kê tất cả các service đang chạy

VD:

Ftp, ssh, telnet: online tức là FTP Server, SSH Server, Telnet Server đang chạy

Quản lý tài nguyên trong solaris

  1. RAM

Tổng RAM:

/usr/sbin/prtconf | grep -i memory

RAM sử dụng cả máy chủ:

# vmstat 1 100 (cột free (KB))

Hoặc

# sar -r 1 100 (cột freemem(KB) * 8 do pagesize=8k)

Hoặc

# prstat -Z (cột RSS) (kết quả khác so với vmstat và sar do câu lệnh này chỉ tính memory cấp cho các process không có cache)

Mô hình kết nối máy chủ với 2 controller đảm bảo an toàn

Storage có 2 controller A & B. Nhưng theo cấu hình hiện tại chỉ có 1 controller A được cấu hình đi qua san switch (controller B hiện tại ko được dùng).

 

Do vậy để đảm bảo tính dự phòng trong trường hợp controller A bị reset thì hệ thống vẫn hoạt động được. Phương án như sau:

1. Bổ sung thêm 2 dây quang sau đó kết nối tới 2 san swich.

2. Cấu hình zoning cho hệ thống để bổ sung controller B

Scan để nhận phân vùng SAN (2 node)

echo |format
root@sol01 # luxadm -e port
/devices/pci@400/pci@2/pci@0/pci@4/SUNW,emlxs@0/fp@0,0:devctl      NOT CONNECTED
/devices/pci@400/pci@2/pci@0/pci@4/SUNW,emlxs@0,1/fp@0,0:devctl    CONNECTED
/devices/pci@500/pci@2/pci@0/pci@a/SUNW,emlxs@0/fp@0,0:devctl      NOT CONNECTED
/devices/pci@500/pci@2/pci@0/pci@a/SUNW,emlxs@0,1/fp@0,0:devctl    CONNECTED
-- Nhan phan vung moi
luxadm -e forcelip /devices/pci@400/pci@2/pci@0/pci@4/SUNW,emlxs@0,1/fp@0,0:devctl 
luxadm -e forcelip /devices/pci@500/pci@2/pci@0/pci@a/SUNW,emlxs@0,1/fp@0,0:devctl
devfsadm -Cv
echo |format
fcinfo hba-port -l 10000000c9b0a311

KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH: 📧 Mail: binhoracle@gmail.com ☎️ Mobile: 0902912888 ⚡️ Skype: tranbinh48ca 👨 Facebook: https://www.facebook.com/BinhOracleMaster 👨 Inbox Messenger: https://m.me/101036604657441 (profile) 👨 Fanpage: https://www.facebook.com/tranvanbinh.vn 👨 Inbox Fanpage: https://m.me/tranvanbinh.vn 👨👩 Group FB: https://www.facebook.com/groups/OracleDBAVietNam 👨 Website: http://www.tranvanbinh.vn 👨 Blogger: https://tranvanbinhmaster.blogspot.com 🎬 Youtube: http://bit.ly/ytb_binhoraclemaster 👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi 👨 Linkin: https://www.linkedin.com/in/binhoracle 👨 Twitter: https://twitter.com/binhoracle 👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội #OracleTutorial #OracleDBA #OracleDatabaseAdministration #học oracle database #oca #ocp #oce #ocm

Quản lý phần cứng trong Solaris

Serial: sneep

All Hardware
# prtdiag -v  // verbose show đầy đủ thông tin
# prtconf

Solaris 11_System Configuration

Quản lý gói trong Solaris 11

Quản lý gói trong Solaris

Các câu lệnh reboot, shutdown Solaris


 

Lệnh

Diễn giải

Reboot

# init 6

(tat service sau do restart)

 

# reboot

reboot -- -r

Reboot luôn mà không tắt service (bật xong dễ chết service)

Sử dụng LogMiner để debug Golden Gate


1. View report repxxx
 
MAP resolved (entry user1.table1):
  map user1.table1, target user11.table1;
Using following columns in default map by name:
  SUB_ID, ORG_MOB_TYPE, ....

Cấu hình thêm/bớt bảng trong Oracle GoldenGate

1. Thêm một bảng cho một group
Ví dụ thêm một bảng mới OWNER_TEST.TABLE_TEST cho group OTHEXT1, và đã có cấu trúc trên database
#1.Trên db1_source
$GGATE/ggsci
DBLOGIN USERID ggate, PASSWORD xxxxx,ENCRYPTKEY DEFAULT
ADD TRANDATA OWNER_TEST.TABLE_TEST

Giám sát Oracle GoldenGate

--1.CHECK

--Log: /u01/app/oracle/goldengate/ggserr.log
1. Check all processes
GGSCI (db1) 8> info all
GGSCI (db1) 8> status all

Quản trị Oracle DataGuard

1. Check

Sử dụng Oracle Broker kiểm tra trạng thái cấu hình DataGuard:

dgmgrl /
show configuration;
show database verbose dbaviet

Hoặc sử dụng SQL kiểm tra apply lag trên Standby:

SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME='apply lag';

Các câu lệnh recovery dữ liệu Oracle Database

• Check các datafile cần recover:

SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;  

select * from v$datafile where status='RECOVER'; -- chú ý trường STATUS nếu RECOVER thì phải recover file 187


select * from dba_data_files where file_id=187; -- chú ý trường ONLINE_STATUS nếu RECOVER thì phải recover file 187

Quy trình bật, tắt Oracle Clusterware 10g

I. Khởi động
1. Start các dịch vụ cluster
(root)#$ORA_CRS_HOME/bin/crsctl start crs
(Thường khi khởi động lại service crs sẽ tự lên)
(hoặc Start  CRS # /etc/init.d/init.ohas d start)

Các câu lệnh hay dùng với srvctl

Để start/stop DB, instance, nodeapp, service
1. Help 
srvctl -h

Quản lý database link trong Oracle Database

--1. CHECK
select * from dba_db_links;

--Check dblink
SQL> select * from dual@db1   // db1 là tên DBLink

Thủ tục tạo dblink bằng user khác

CREATE OR REPLACE PROCEDURE user1.cre_dbl
IS
    v_sql   LONG;
BEGIN
    v_sql :=
        'CREATE DATABASE LINK dblink1

Thủ tục cấu hình Resource Manager

--Giới hạn Active session, parallel


/***** 1.CẤU HÌNH *****/
-- 1.1.Plan
begin 
 dbms_resource_manager.create_pending_area(); 
end; 

Quản lý Scheduler Job trong Oracle Database

DBMS_SCHEDULER là 1 giải pháp lên lịch chạy chương trình có từ Oracle 10g.  Cách tạo job cũ với DBMS_JOB vẫn có thể sử dụng

Quản lý JOB trong Oracle Database

1. Check
-- Check job dang chay
select * from DBA_JOBS_RUNNING
-- Check noi dung job
select * from dba_jobs where job=253

Quản lý Synonym trong Oracle Database

1. Check

select * from dba_synonyms;

Quản lý Trigger trong Oracle Database

--1.CHECK
select trigger_name
, trigger_type
, table_name
, status
from dba_triggers
where owner = '&owner'
order by status, table_name

Quản lý thủ tục trong Oracle Database

select * from DBA_PROCEDURES

select * from dba_errors

Quản lý package trong Oracle Database

--1.CHECK
DBA_PROCEDURES
dba_errors
// check tr?ng thái c?a package (valid, invalid)
select * from DBA_OBJECTS where owner like 'PNE_OWNER' and object_type like 'PACKAGE'

// View content source package, function, procedure theo dòng
DBA_SOURCE  

Quản lý Functions trong Oracle Database

select * from DBA_PROCEDURES

Quản lý contrains trong Oracle Database


--Check
Dba_contraint

--Add contraint

Quản lý sequence trong Oracle Database

select * from DBA_SEQUENCES where sequence_name like '%table1%'

Tạo view nhiều bảng trong Oracle Database

DROP VIEW user1.V_table1;

/* Formatted on 17/06/2013 09:02:28 (QP5 v5.163.1008.3004) */
CREATE OR REPLACE FORCE VIEW user1.V_table1

Script rebuild index theo ngày, tháng, năm trong Oracle Database

---index theo nam
DECLARE
   v_nam          varchar2(4) := '2012';
   v_tablespace   varchar2(50):='INDX';
   cursor c1 is  
--     select table_owner,table_name,max(partition_name)
--     from dba_tab_partitions group by table_owner,table_name having max(partition_name) like '%'||v_nam||'%' and length(max(partition_name))<9;
     select table_owner,table_name,max(partition_name)
     from dba_tab_partitions where table_name='table1' group by table_owner,table_name;

Quản lý Index Partition trong Oracle Database

--1.CHECK
select a.* from DBA_PART_INDEXES a, DBA_TAB_PARTITIONS b where a.owner=B.TABLE_OWNER and a.table_name=B.TABLE_NAME and a.owner not like 'SYS%' and b.partition_name like '%20131231';

-- Script rebuild index partititon unusable
select 'alter index ' || index_owner || '.' || index_name || ' rebuild partition ' || partition_name || ' tablespace INDX nologging parallel 8 online;' from dba_ind_partitions where status='UNUSABLE';


-- Script rebuild các partition index 
--+ Bước 1: Rebuild
select 'alter index ' || index_owner || '.' || index_name || ' rebuild partition ' || partition_name || ' tablespace INDX' ||substr(partition_name,5,4)||' nologging parallel 8 online;' from dba_ind_partitions where 
index_owner='APP_OWNER'
and index_name in (
'index_name_1',
'index_name_2'
)
order by partition_name desc
;
--+ Bước 2: Nologging noparallel
alter index app_owner.index_name_1 noparallel nologging;
alter index app_owner.index_name_2 noparallel nologging;

Thử nghiệm index chạy chậm hơn quét FULL trong Oracle Database

 A.PAYMENT_TYPE NOT IN ('10', '11', '55');

Tạo virtual index trong Oracle Database

CREATE TABLE objects_tab AS SELECT * FROM all_objects;

ALTER TABLE objects_tab ADD (
  CONSTRAINT objects_tab_pk PRIMARY KEY (object_id)
);

Chuyển bảng non-partition sang partition theo tháng trong Oracle Database

-- Thu tuc chuyen bang user1.table1 partition theo bdate sang partition theo thang
--1.CHECK, lay bang partition
select * from dba_tab_partitions where length(partition_name)=10;

--Lay cau truc bang sau ra lam mau
user1    table1

Chuyển bảng non-partition sang partition theo ngày trong Oracle Database

Mục đích: Khi bảng non-partiton lớn (> 2GB hoặc > 50 triệu row) thì chúng ta cân nhắc chuyển bảng sang partition, nếu quét theo ngày thì tạo partition theo ngày theo thủ tục sau:

select min(month) from user1.table1_NOPART;
     
--select min(load_date) from user1.table1  ;
--1.Rename table
alter table user1.table1 rename to table1_NOPART;

Tạo bảng partition theo ngày và add thêm partition thiếu của 1 bảng theo ngày trong Oracle Database

1. TẠO BẢNG

CREATE TABLE test_owner.tab1
    (ID                     VARCHAR2(15) NOT NULL,
    start_datetime                  DATE NOT NULL,
    col1 DATE NOT NULL,
    col2 VARCHAR2(1) NOT NULL,
    col3 NUMBER(10,0),
)
TABLESPACE DATA
PARTITION BY RANGE (start_datetime)
(
  PARTITION DATA20210303 VALUES LESS THAN (TO_DATE(' 2021-03-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  TABLESPACE DATA202103
)

2. THÊM PARTITION CÁC NGÀY KHÁC CHO BẢNG

DECLARE
   v_nam          NUMBER (4) := 2021;
   v_owner        varchar2 (50) := 'test_owner';
   v_tablename    VARCHAR2 (50) := 'tab1';

GIẢI PHÁP: NÉN DỮ LIỆU LÀM GIẢM DUNG LƯỢNG VÀ TĂNG TỐC ĐỘ TRUY XUẤT DỮ LIỆU trong Oracle Database

1. Kiểm tra dung lượng của từng partition trước khi compress:
 
select segment_name,partition_name,bytes/1024/1024 "MB"
from dba_Segments where segment_type = 'TABLE PARTITION' 
and owner like 'user1'
--and lower(SEGMENT_name) like 'segment_name1%'
and bytes/1024/1024 >2
order by MB desc

Tạo bảng Hash Partition trong Oracle Database

--Tạo bảng sales hash partition 

CREATE TABLE sales_hash
  (s_productid  NUMBER,
   s_saledate   DATE,
   s_custid     NUMBER,
   s_totalprice NUMBER)
PARTITION BY HASH(s_productid)
( PARTITION p1 TABLESPACE tbs1
, PARTITION p2 TABLESPACE tbs2
, PARTITION p3 TABLESPACE tbs3
, PARTITION p4 TABLESPACE tbs4
);


--Tạo  composite range-hash partitioned table dùng mệnh đề STORE IN 

CREATE TABLE sales

  ( prod_id       NUMBER(6)

  , cust_id       NUMBER

  , time_id       DATE

  , channel_id    CHAR(1)

  , promo_id      NUMBER(6)

  , quantity_sold NUMBER(3)

  , amount_sold   NUMBER(10,2)

  )

 PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)

  SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4)

 ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))

 , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))

 , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))

 , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))

 );

--Tạo bảng với composite range-hash partitioning

CREATE TABLE page_history

( id                NUMBER NOT NULL

, url               VARCHAR2(300) NOT NULL

, view_date         DATE NOT NULL

, client_ip         VARCHAR2(23) NOT NULL

, from_url          VARCHAR2(300)

, to_url            VARCHAR2(300)

, timing_in_seconds NUMBER

) PARTITION BY RANGE(view_date) INTERVAL (NUMTODSINTERVAL(1,'DAY'))

SUBPARTITION BY HASH(client_ip)

SUBPARTITIONS 32

(PARTITION p0 VALUES LESS THAN (TO_DATE('01-JAN-2006','dd-MON-yyyy')))

PARALLEL 32 COMPRESS;


CREATE  TABLE ABC(

id VARCHAR2(100) primary key,

datecreated DATE)

PARTITION BY RANGE (datecreated) INTERVAL (NUMTODSINTERVAL(1,'DAY'))

  SUBPARTITION BY HASH (ID) SUBPARTITIONS 4

 (PARTITION lessthan2018  VALUES LESS THAN (TIMESTAMP' 2018-01-01 00:00:00') );

Tạo bảng partition theo năm trong Oracle Database

CREATE TABLE binhtv.table1
(
  ACTION_AUDIT_ID  NUMBER(20),
  SHOP_CODE        VARCHAR2(20 BYTE),

Thủ tục tạo bảng partition theo quý trong Oracle Database

DROP TABLE REPDB.SALES CASCADE CONSTRAINTS;

CREATE TABLE REPDB.SALES
(
  PROD_ID        NUMBER(6),
  CUST_ID        NUMBER,
  TIME_ID        DATE,
  CHANNEL_ID     CHAR(1 BYTE),
  PROMO_ID       NUMBER(6),
  QUANTITY_SOLD  NUMBER(3),
  AMOUNT_SOLD    NUMBER(10,2),
  SUPPLEMENTAL LOG DATA (ALL) COLUMNS
)

Thủ tục tạo bảng partition theo tháng trong Oracle Database

--DROP TABLE user1.table1 CASCADE CONSTRAINTS;

CREATE TABLE user1.table1
(
  SUB_ID    NUMBER(20),
  ISDN      VARCHAR2(15 BYTE),
  REG_DATE  DATE,
  SYS_DATE  DATE,
  COMMAND   VARCHAR2(50 BYTE)
)

Thủ tục tạo bảng partition theo ngày trong Oracle Database

--Thủ tục tạo partition theo ngày trong Oracle Database
-- 1.Tao bang
CREATE TABLE cus.table1
    (imsi                           VARCHAR2(15) NOT NULL,
    bill_datetime                  DATE NOT NULL,    
    acc_profile                    VARCHAR2(20),
    credit_charged                 NUMBER(10,2)
)
TABLESPACE DATA
PARTITION BY RANGE (bill_datetime)
(
  PARTITION DATA20210101 VALUES LESS THAN (TO_DATE('2021-01-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  TABLESPACE DATA2021
)

--2.Add them partition
DECLARE
   v_nam          NUMBER (4) := 2021; --2014
   v_tablename    VARCHAR2 (50) := 'table1';
   v_date_from   date    := to_date('02/01/2021','dd/mm/yyyy');
   v_date_to     date    := to_date('31/12/2021','dd/mm/yyyy');
   v_numday     number(5);
   v_tablespace varchar2(50):='DATA2021';
BEGIN
   v_numday:=v_date_to-v_date_from; 
   FOR i IN 0 .. v_numday
   LOOP
      DBMS_OUTPUT.put_line ('alter table '|| v_tablename || ' add PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE '||v_tablespace||';');
   END LOOP;
END;

-- Vao muc DBMS_Ouput cua TOAD:

--3.Tao index
create index  cus.table1_I1 on cus.table1(imsi) local parallel 8 nologging online

create index  cus.table1_I2 on cus.table1(acc_profile)  parallel 8 nologging online

alter table  cus.table1 truncate partition data20210101

alter table  cus.table1 drop partition data20210101

select * from dba_indexes where owner='CUS'
and table_name='TABLE1';

alter table  cus.table1 truncate partition data20210102

select * from dba_ind_partitions where index_owner='CUS'
and index_name='TABLE1_I1'
and status!='USABLE';


alter index  cus.table1_I1 nologging noparallel;

--3.Rebuild index ve tablespace INDX
DECLARE
   v_date_from   date    := to_date('01/01/2021','dd/mm/yyyy');
   v_date_to     date    := to_date('31/12/2021','dd/mm/yyyy');
   v_numday     number;
   v_tablespace varchar2(50):='INDX';
   cursor c1 is
     select a.* from DBA_PART_INDEXES a, DBA_TAB_PARTITIONS b where a.owner=B.TABLE_OWNER  and a.table_name=B.TABLE_NAME  and b.table_owner='CUS' and b.table_name='TABLE1'  and a.index_name not like '%$%' and b.partition_name like '%20211231'  order by a.owner,a.index_name;
BEGIN
   v_numday:=v_date_to-v_date_from; 
   FOR i1 in c1
   LOOP
       FOR i IN 0 .. v_numday
       LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.owner||'.'||i1.index_name || ' REBUILD PARTITION DATA'||to_char(v_date_from+i,'YYYYMMDD')||' TABLESPACE '||v_tablespace||to_char(v_date_from+i,'YYYY')||' nologging parallel 8 online;');
       END LOOP;
   END LOOP;
END;

-- Set nologging noparallel
DECLARE
   cursor c1 is
        select distinct a.index_owner, a.index_name from DBA_ind_partitions a where  a.index_owner='CUS' and a.index_name not like '%$%' and a.partition_name like '%20211231'  
        order by a.index_owner,a.index_name;
BEGIN
   FOR i1 in c1
   LOOP
            DBMS_OUTPUT.put_line ('alter index '||i1.index_owner||'.'||i1.index_name || ' nologging noparallel;');
   END LOOP;
END;

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master