Thứ Ba, 13 tháng 9, 2022

[VIP5] CÁC THAO TÁC VẬN HÀNH HỆ THỐNG ORACLE DATABASE

MỤC LỤC:

4.1. Startup/Shutdown
4.1.1. Startup/Shutdown Clusterware Oracle RAC
4.1.2. Startup/Shutdown Oracle database
4.1.3. Startup/Shutdown ASM
4.1.4. Start/Stop Oracle Listener
4.1.5. Start/Stop Oracle Resource
4.2. Backup/Restore
4.2.1. Backup Database
4.2.2. Restore Database
4.2.3. Backup cấu hình cluster (optional)
4.2.4. Restore cấu hình cluster
4.3. Quản lý người dùng trên database
4.3.1. Create User/Role
4.3.2. Gán/revoke quyền truy cập
4.3.2. Đổi password
4.3.3. Unlock account
4.3.4. Lock account
4.4. Quản lý tablespace và Datafile
4.4.1. Tạo mới tablespace
4.4.2. Tạo temporary tablespace
4.4.3. Thêm Datafile cho tablespace
4.4.4. Thêm datafile cho temp tablespace
4.4.5. Drop tablespace
4.4.6. Drop temp tablespace
4.4.7. Drop datafile
4.4.8. Drop 1 tempfile
4.4.9. Backup tablespace cũ theo chu kỳ
4.4.10. Các bước restore tablespace từ tape/backup tập trung
4.4.11. Chuyển dữ liệu cũ từ phân vùng DATA sang RECO
4.5. Quản lý Oracle parameter 4.6. Quản lý Control file 4.7. Quản lý redo log 4.8. Quản lý session, lock 4.9. Kill phiên làm việc (session) treo 4.10. Quản lý Archived log 4.11. Rebuild Index 4.12. Compile object 4.13. Điều chỉnh cấp phát RAM/Process cho database 4.14. Quản lý Disk, diskgroup ASM
4.14.1. Create/Drop DISKGROUP ASM
4.14.2. Thực hiện add disk trên OS
4.14.3. Add disk vào ASM group
4.14.4. Drop disk trong diskgroup
4.14.5. Thủ tục add ổ đĩa mới vào diskgroup DATA trong Solaris của cơ sở dữ liệu Oracle
4.14.6. Thủ tục add đĩa vào diskgroup DATA trong AIX trong ASM
4.15. Quản trị vận hành multitenants database
4.15.1. Create Pluggable database
4.15.2. Drop Pluggable database
4.16. Gather statistics
4.16.1. Gather cả DB
4.16.2. Gather mức schema:
4.16.3. Gather mức tables:
4.16.4. Gather bảng to có partition:
4.16.5. Script hay dùng khác: Script gather bảng non-partition STALE

4.1. Startup/Shutdown

4.1.1. Startup/Shutdown Clusterware Oracle RAC

Hệ thống Clusterware sẽ được khởi động cùng với quá trình hệ điều hành khởi động, tuy nhiên có nhiều trường hợp người quản trị sẽ phải khởi động Clusterware bằng tay. Khi đó thực hiện như sau:

Login vào máy chủ database với user “root” trên từng node cần startup Clusterware, chạy lệnh sau:

$ cd /u01/app/12.2.0/grid/bin

-         Startup Clusterware:

$ ./crsctl start crs

Kết quả trả về “Oracle High Availability Services has been started” là startup clusterware thành công

 

-         Để Shutdown Clusterware:

$./crsctl stop crs -f

Kết quả trả về “Oracle High Availability Services has been stopped” là startup clusterware thành công

 

4.1.2. Startup/Shutdown Oracle database

Login vào máy chủ database với user “oracle”, chạy lệnh sau:

$ cd $ORACLE_HOME/bin

-         Startup database:

ü  Chạy lệnh theo cú pháp sau để startup tất cả Oracle RAC instances cho 1 database, thay tham số <DB name> tương ứng theo mục “4. Danh sách máy chủ và quản trị”

$ srvctl start database -d <DB name>

è Kiểm tra trạng thái của database sau khi bật, chạy lệnh theo cú pháp. Trạng thái trả về “running on” là thành công

$ srvctl status database -d <DB name>

Ví dụ: Với database CRM

ü  Hoặc truy nhập vào tất cả các máy chủ của database đó và chạy lệnh sau với kết quả trả về “Oracle instance started

$ sqlplus /as sysdba

SQL>startup

-          Startup 1 instances:

ü  Chạy lệnh theo cú pháp sau và thay <DB Name>, <Instance Name> giá trị tương ứng:

$ srvctl start instance -d <DB name> -i <instance name>

è Kiểm tra trạng thái của database sau khi bật, chạy lệnh theo cú pháp. Trạng thái trả về “running on” là thành công

$ srvctl status instance -d <DB name> -i <instance name>

Ví dụ: Với database: ebglssp và instance: ebglssp1

ü  Hoặc chạy lệnh sau, với kết quả trả về “Oracle instance started

$ sqlplus /as sysdba

SQL> startup

-         Shutdown tất cả Oracle instances:

ü  Chạy lệnh theo cú pháp sau và thay <DB Name> giá trị tương ứng:

$ srvctl stop database -d <DB name>

è Kiểm tra trạng thái của database, chạy lệnh theo cú pháp. Trạng thái trả về “is not running on” là thành công

$ srvctl status database -d <DB name>

ü  Hoặc truy nhập vào tất cả các máy chủ của database đó và chạy lệnh, với kết quả trả về “Oracle instance shut down” là thành công

$sqlplus / as sysdba

SQL> shutdown immediate;

-         Shutdown 1 instance:

ü  Chạy lệnh theo cú pháp sau và thay <DB Name>, <Instance Name> giá trị tương ứng:

$ srvctl stop instance -d <DB_name> -i <instance_name>

è Kiểm tra trạng thái của database, chạy lệnh theo cú pháp. Trạng thái trả về “is not running on” là thành công

ü  Hoặc chạy lệnh, với kết quả trả về “Oracle instance shut down” là thành công

$sqlplus / as sysdba

SQL>Shutdown immediate

4.1.3. Startup/Shutdown ASM

Login vào máy chủ database với user “grid”, chạy lệnh sau:

$ cd $ORACLE_HOME/bin

-         Startup ASM:

ü  Chạy lệnh sau:

$ srvctl start asm

è  Để kiểm tra kết quả ta chạy lệnh theo sau với kết quả trả về “ASM is running on” là thành công

$ srvctl status asm

Ví dụ:

 

ü  Hoặc chạy lệnh sau, với kết quả trả về “ASM diskgroups mounted” là thành công

$ sqlplus /as sysasm

SQL>startup

SQL> startup

ASM instance started

Total System Global Area 1140850688 bytes

Fixed Size                     8629704 bytes

Variable Size                1107055160 bytes

ASM Cache                   25165824 bytes

ASM diskgroups mounted

-         Startup ASM cho 1 instance:

ü  Chạy lệnh sau:

$ srvctl start asm -node <server_name>

Ví dụ:

$ srvctl start asm -node csdl01

è Để kiểm tra kết quả ta chạy lệnh theo sau với kết quả trả về “ASM is running on” là thành công

ü  Hoặc chạy lệnh sau:

$ sqlplus /as sysasm

SQL>startup

-         Shutdown ASM:

ü  Chạy lệnh:

$ srvctl stop asm

è Để kiểm tra kết quả ta chạy lệnh theo sau với kết quả trả về “ASM is not running” là thành công

ü  Hoặc truy nhập vào tất cả các máy chủ của database đó và chạy lệnh:

$ sqlplus /as sysasm

SQL>shutdown immediate

ASM diskgroups dismounted

ASM instance shutdown

-         Shutdown 1 ASM instance:

ü  Chạy lệnh sau:

$ srvctl stop asm -node <server_name>

Ví dụ:

$ srvctl stop asm -node cdl01

ü  Hoặc có thể chạy lệnh sau:

$ sqlplus /as sysasm

SQL>shutdown immediate

ASM diskgroups dismounted

ASM instance shutdown

4.1.4. Start/Stop Oracle Listener

Login vào máy chủ database với user “grid”, chạy các lệnh sau:

-         Start listener của toàn bộ database:

ü  Chạy lệnh theo cú pháp sau và thay tham số tương ứng

$ srvctl start listener

è  Kiểm tra kết quả ta dùng lệnh sau với kết quả trả về: “LISTENER is running on node” là thành công

$ srvctl status listener

ü  Hoặc vào từng máy chủ database chạy lệnh sau, với kết quả trả về “The command completed successfully” là thành công

$ lsnrctl start

-         Start listener trên 1 instance:

ü  Chạy lệnh theo cú pháp sau và thay tham số tương ứng

$ srvctl start listener -n <DB Server>

Ví dụ :

$ srvctl start listener -n csdl01

è Kiểm tra kết quả ta dùng lênh sau với kết quả trả về: “LISTENER is running on node”

$ srvctl status listener

ü  Hoặc chạy lệnh sau:

$ lsnrctl start

-         Stop listener của toàn bộ database:

ü  Chạy lệnh theo cú pháp sau và thay tham số tương ứng

$ srvctl stop listener

è Kiểm tra kết quả ta dùng lênh sau với kết quả trả về: “LISTENER is not running” là thành công

$ srvctl status listener

ü  Hoặc vào từng máy chủ database chạy lệnh sau với kết quả trả về “The command completed successfully” là thành công

$ lsnrctl stop

-         Stop listener trên 1 instance:

ü  Chạy lệnh theo cú pháp sau và thay tham số tương ứng

$ srvctl stop listener -n <DB Server>

Ví dụ :

$ srvctl stop listener -n csdl01

è Kiểm tra kết quả ta dùng lệnh sau với kết quả trả về: “LISTENER is running on node” là thành công

ü  Hoặc chạy lệnh sau:

$ lsnrctl stop

4.1.5. Start/Stop Oracle Resource

Login vào máy chủ database với user “root”, chạy các lệnh sau:

-         Start Resource:

$ cd /u01/app/12.2.0/grid/bin

ü  Thực hiện lệnh theo cú pháp sau và thay tham số tương ứng:

$ ./ crsctl start resource <resource> -n <db name>

ü  Trường hợp muốn start toàn bộ các resource

$ ./ crsctl start resource -all

è Kiểm tra kết quả ta dùng lệnh sau với kết quả trả về: “ONLINE” là thành công

$ ./ crsctl status resource

-         Stop Resource:

ü  Thực hiện lệnh theo cú pháp sau và thay tham số tương ứng:

$ ./ crsctl stop resource <resource> -n <db name>

ü  Trường hợp muốn start toàn bộ các resource

$ ./ crsctl stop resource -all

è Kiểm tra kết quả ta dùng lệnh sau với kết quả trả về: “OFFLINE” là thành công

$ ./ crsctl status resource

4.2. Backup/Restore

4.2.1. Backup Database

Đây là công việc quan trọng nhất đối với những người làm công tác quản lý vận hành CSDL, bản backup nên lưu ở phân vùng SAN khác so với dữ liệu, khuyến cáo backup lên nhiều nơi (như tape hoặc backup tập trung) và hàng năm nên backup các full vào đầu năm, giữa năm và cuối năm ra thiết bị ngoài (như tape hoặc backup tập trung).

a. Tạo script backup:

Tạo scritp backup level 0

$ cd ~/backup (hoặc cd /home/oracle/backup)

$ mkdir  logs

$ mkdir  level0

$ mkdir  level1

 

oracle@dbaviet-db02 # vi /home/oracle/backup/level0.rman

#################################

# Script for backup full database dbaviet

# Created Date 13/10/2020

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/backup/level0/auto_dbaviet_ctl%F';

run {

CROSSCHECK BACKUP;

DELETE NOPROMPT EXPIRED BACKUP;

DELETE NOPROMPT OBSOLETE;

CROSSCHECK ARCHIVELOG ALL;

delete noprompt expired archivelog all;

BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK INCREMENTAL LEVEL 0 DATABASE FORMAT '/home/oracle/backup/level0/dbaviet_%T_%d_%u_%s' FILESPERSET 10 MAXSETSIZE 80G TAG LEVEL0; 

sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';

BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK ARCHIVELOG ALL FORMAT '/home/oracle/backup/level0/arc_%T_%d_%u_%s_%U' FILESPERSET 10 TAG ARCH;

DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-2';

#sql ' BEGIN TEST_SEND_MAIL_BACKUP; END; ';

}

EXIT;

 

oracle@dbaviet-db02 # vi /home/oracle/backup/level0.sh 

#################################

# Script for backup full database dbaviet

# Created Date 13/10/2020

#su - oracle

logfile=`date +%Y%m%d`_level0.log 

export ORACLE_SID=db12c

export NLS_DATE_FORMAT="yyyy-mm-dd hh24:mi:ss"

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1

export PATH=$ORACLE_HOME/bin:$PATH

rman target / nocatalog cmdfile /home/oracle/backup/level0.rman  log /home/oracle/backup/logs/$logfile

exit

 

 

Tạo script backup level 1

 

oracle@dbaviet-db02 # vi /home/oracle/backup/level1.rman

#################################

# Script for backup incremental database dbaviet

# Created Date 13/10/2020

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/oracle/backup/level1/auto_dbaviet_ctl%F';

run {

CROSSCHECK BACKUP;

DELETE NOPROMPT EXPIRED BACKUP;

DELETE NOPROMPT OBSOLETE;

CROSSCHECK ARCHIVELOG ALL;

delete noprompt expired archivelog all;

BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK INCREMENTAL LEVEL 1 DATABASE FORMAT '/home/oracle/backup/level1/dbaviet_%T_%d_%u_%s' FILESPERSET 10 MAXSETSIZE 80G TAG LEVEL1; 

sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';

BACKUP AS COMPRESSED BACKUPSET DEVICE TYPE DISK ARCHIVELOG ALL FORMAT '/home/oracle/backup/level1/arc_%T_%d_%u_%s_%U' FILESPERSET 10 TAG ARCH;

DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-1';

#sql ' BEGIN TEST_SEND_MAIL_BACKUP; END; ';

}

EXIT;

 

oracle@dbaviet-db02 # vi  /home/oracle/backup/level1.sh

#################################

# Script for backup incremental database dbaviet

# Created Date 13/10/2020

logfile=`date +%Y%m%d`_level1.log 

export ORACLE_SID=db12c

export NLS_DATE_FORMAT="yyyy-mm-dd hh24:mi:ss"

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1

export PATH=$ORACLE_HOME/bin:$PATH

rman target / nocatalog cmdfile /home/oracle/backup/level1.rman  log /home/oracle/backup/logs/$logfile

exit

 

b. Phân quyền chạy 

$ cd /home/oracle/backup/

 

$ chmod +x *.sh

 

Yêu cầu phải có đầy đủ các file sau:

 

(file swp bỏ qua)

 

c. Tạo crontab backup tự động trên OS, user oracle

#########backupdb_dbaviet########

Vào bằng user oracle

 

(oracle)$ crontab -e

 

00 00 * * 0,3 /home/oracle/backup/level0.sh             #00h ngày thứ 4 và chủ nhật backup level 0

00 00 * * 1,2,4,5,6 /home/oracle/backup/level1.sh    #Các ngày còn lại backup level 1

 

Sau đó lưu lại bằng phím Esc --> :wq (write and quite)

 

Kiểm tra lại nếu có 2 dòng như trên là thành công:

 

(oracle)$ crontab -l 

 

Kiểm tra log lịch chạy bằng crontab sinh ra:

 

oot@ol7 log]# tail -1000f /var/log/cron

Oct  1 00:00:00 ol7 CROND[22179]: (oracle) CMD (/home/oracle/backup/level1.sh    #C\303\241ng\303\240c\303\262?i backup level 1)

 

d. Kiểm tra lại bản backup

 

RMAN > list backup;

 

RMAN> list backup summary;

 

RMAN> list backup of datafile 1;

 

SQL> select command_id, start_time, end_time, status,INPUT_TYPE, input_bytes_display, output_bytes_display, time_taken_display, round(compression_ratio,2) RATIO , input_bytes_per_sec_display, output_bytes_per_sec_display

from v$rman_backup_job_details 

where trunc(end_time)>=trunc(sysdate-120)

order by end_time desc; 

 

 

Khi có lỗi backup kiểm tra log file: /home/oracle/backup/logs/$logfile (trong dó logfile=`date +%Y%m%d`_level1.log)

 

è Kết quả trả về: Không thông báo “ORA-” và “Recovery Manager complete” là thành công.

4.2.2. Restore Database

a.  Khôi phục sự cố khi hỏng một datafile:

+       Telnet vào máy chủ CSDL bằng user oracle

+       Chạy chương trình RMAN bằng lệnh sau:

rman target=/

+       Restore lại file bị lỗi:

Ví dụ cần Restore datafile 5: “/u01/oradata/data01.dbf”

RUN

{

  SQL 'ALTER DATABASE DATAFILE 5 OFFLINE';

  # Khi restore vào phân vùng khác, bỏ comment

  # SET NEWNAME FOR DATAFILE 5 TO '/newdirectory/new_filename.f';

  RESTORE DATAFILE 5;

  # Khi restore vào phân vùng khác, bỏ comment

# SWITCH DATAFILE ALL;

  RECOVER DATAFILE 5;

  SQL 'ALTER DATABASE DATAFILE 5 ONLINE';

}

b. Khôi phục tablespace

+       Telnet vào máy chủ CSDL bằng user oracle

+       Chạy chương trình RMAN bằng lệnh sau:

rman target=/

+       Restore lại Tablespace.

RUN

{

  SQL 'ALTER TABLESPACE TBS_5 OFFLINE';

  RESTORE TABLESPACE TBS_5;

  RECOVER TABLESPACE TBS_5;

  SQL 'ALTER TABLESPACE TBS_5 ONLINE';

}

c.  Khôi phục sự cố khi hỏng toàn bộ database

+       Telnet vào máy chủ CSDL bằng user oracle

+       Chạy chương trình RMAN bằng lệnh sau:

rman target=/

+       Restore lại Database.

STARTUP MOUNT FORCE;

RUN

{

  RESTORE DATABASE;

  RECOVER DATABASE;

  ALTER DATABASE OPEN;

}

 

d.     Khôi phục lại database trước 1 thời điểm xác định

Được áp dụng khi có 1 user thực hiện drop một object trong CSDL và người quản trị hệ thống muốn khôi phục cơ sở dữ liệu trước thời điểm object đó bị drop.

+       Telnet vào máy chủ CSDL bằng user oracle

+       Chạy chương trình RMAN bằng lệnh sau:

rman target=/

+       Restore lại Database.

STARTUP MOUNT FORCE;

RUN

{

  SET UNTIL TIME "TO_DATE('2001-04-09:14:30:00','yyyy-dd-mm:hh24:mi:ss')";

  RESTORE DATABASE;

  RECOVER DATABASE;

  ALTER DATABASE OPEN RESETLOGS;

}

e.      Khôi phục Controlfile khi bị mất Controlfile

+       Telnet vào máy chủ CSDL bằng user oracle

+       Chạy chương trình RMAN bằng lệnh sau:

rman target=/

+       Restore lại Controlfile.

SET DBID <database_id>; # set database id từ RMAN

STARTUP NOMOUNT;

RUN

{

  RESTORE CONTROLFILE FROM “ban backup controlfile”;

  ALTER DATABASE MOUNT;

  RECOVER DATABASE;

  ALTER DATABASE OPEN RESETLOGS;

}

4.2.3. Backup cấu hình cluster (optional)

OCR lưu trữ thông tin cấu hình cluster, shared disk và được truy nhập từ tất cả các node trong cluster. OCR được backup tự động bởi CRSD process 4h/lần, hoặc có thể thực hiện backup manual bằng lệnh.

Login vào máy chủ database với user “grid”, chạy các lệnh sau:

-         Kiểm tra backup của ORC:

$ cd /u01/app/12.2.0/grid/bin

$ ./ocrconfig -showbackup

-         Thay đổi đường dẫn backup OCR

Chạy lệnh theo cú pháp sau và thay đổi tham số:

$ cd /u01/app/12.2.0/grid/bin

$ ./ocrconfig -backuploc <new location>

Ví dụ:

$ cd /u01/app/12.2.0/grid/bin

$ ./ocrconfig -backuploc /tmp/

4.2.4. Restore cấu hình cluster

Login vào máy chủ database với user “root”, chạy các lệnh sau:

- Tắt cluster trên tất cả các node

# cd /u01/app/12.2.0/grid/bin

# ./crsctl stop crs -f

è Kiểm tra kết quả thực hiện chạy lệnh: Với kết quả trả về “CRS-4639: Could not contact Oracle High Availability Services” là thành công

# ./crsctl check crs

Ví dụ:

[root@csdl01 bin]# ./crsctl check crs

CRS-4639: Could not contact Oracle High Availability Services

-         Bật cluster ở exclusive mode mà không bật crsd

# cd /u01/app/12.2.0/grid/bin

# ./crsctl start crs -excl -nocrs

è Kiểm tra kết quả thực hiện chạy lệnh: Với kết quả trả về “CRS-4638: Oracle High Availability Services is online” là thành công

$./crsctl check crs

Ví dụ:

[root@csdl01 bin]# ./crsctl check crs

CRS-4638: Oracle High Availability Services is online

CRS-4535: Cannot communicate with Cluster Ready Services

-         Khôi phục OCR

Chạy lệnh sau và thay tham số phù hợp, câu lệnh chạy không báo lỗi là thành công:

$ ocrconfig -restore <OCR backed up file>

Ví dụ

$ ocrconfig -restore +MGMT:/ebglssp-cluster/OCRBACKUP/backup_20190926_165951.ocr.285.1020013193

-         Restart lại cluster:

$ cd /u01/app/12.2.0/grid/bin

$ ./crsctl stop crs -f

$ ./crsctl start crs

è Kiểm tra kết quả thực hiện chạy lệnh sau, kết quả trả về các service “online” là thành công:

$./crsctl check crs

Ví dụ:

[root@csdl01 bin]# ./crsctl check crs

CRS-4638: Oracle High Availability Services is online

CRS-4537: Cluster Ready Services is online

CRS-4529: Cluster Synchronization Services is online

CRS-4533: Event Manager is online

4.3. Quản lý người dùng trên database

Login vào máy chủ database với user “oracle”

$ su  - oracle

$ sqlplus / as sysdba

4.3.1. Create User/Role

-         Trong môi trường multitenant, có 2 loại User/Role:

ü  Common User/Role: là user/role có mặt ở tất cả các PDB

ü  Local User/role: là user/role chỉ có trong 1 PDB, username cùng tên có thể có mặt ở các PDB khác nhưng 2 user này không có liên quan gì đến nhau.

-         Để tạo được Common Users/Role thì phải thỏa mãn các yêu cầu:

ü  Phải connect bằng 1 common user/role mà có quyền CREATE USER/ROLE

ü  Connect ở mức CDB$ROOT

ü  Tên của Common user/role phải bắt đầu bằng ‘C##’ hoặc ‘c##’ và chỉ chứa kí tự ASCII hoặc EBCDIC

ü  Tên của Common user/role là duy nhất ở tất cả các PDB

ü  DEFAULT TABLESPACE, TEMPORARY TABLESPACE, QUOTA và PROFILE phải tồn tại trên tất cả các PDB.

-         Để tạo được Local users/role thì phải thỏa mãn các yêu cầu:

ü  Phải connect bằng user có quyển CREATE USER/ROLE

ü  Tên của Local user/role không bắt đầu bằng ‘C##’, ‘c##’

ü  Tên của Local user/role là duy nhất trong PDB đó

ü  PDB phải ở chế độ Open

-         Tạo Common user

Chạy lệnh theo cú pháp sau và thay tham số tương ứng, với kết quả câu lệnh trả về “User created” là thành công.

SQL> CREATE USER c##<User> IDENTIFIED BY <password> CONTAINER=ALL;

SQL> CREATE ROLE c##<Role>;

-         Tạo Local user

Chạy lệnh theo cú pháp sau và thay tham số tương ứng, với kết quả câu lệnh trả về “User created” là thành công.

SQL> alter session set container = <pdb>;

SQL> create user <local user> identified by <password> container=current;

SQL> CREATE ROLE <local Role>;

Ví dụ:

4.3.2. Gán/revoke quyền truy cập

- Gán quyền Quyền view package:

    grant SELECT ANY DICTIONARY to user02;

        grant debug any procedure to user02

-         Thu hồi quyền view package:

  grant SELECT ANY DICTIONARY to user02;

      grant debug any procedure to user02;

-         Gán Quyền object:

+ Gán Quyền Trên bảng: GRANT SELECT, INSERT, UPDATE, DELETE ON TEST_OWNER.TAB1 TO user02;

+ Gán Quyền Trên cột: GRANT INSERT (ename, job) ON emp TO user02;

-         Thu hồi Quyền object:

+ Gán Quyền Trên bảng: revoke SELECT, INSERT, UPDATE, DELETE ON TEST_OWNER.TAB1 TO user02;

+ Gán Quyền Trên cột: revoke INSERT (ename, job) ON emp TO user02;

(Các lệnh khác tương tự)

4.3.2. Đổi password

Chạy câu lệnh theo cú pháp sau, và thay giá trị tham số <account>, <password> tương ứng, với kết trả về “User altered” là thành công

SQL> alter user <account> identified by <password>;

Ví dụ:

SQL> Alter user system identified by *****;

User altered.

4.3.3. Unlock account

Chạy câu lệnh theo cú pháp sau và thay giá trị tham số <account>, với kết trả về “User altered” là thành công

SQL> alter user <account> account lock;

4.3.4. Lock account

Chạy câu lệnh theo cú pháp sau và thay giá trị tham số <account>, <password>, với kết trả về “User altered” là thành công

SQL> alter user <account> unlock IDENTIFIED BY <password>;

Lưu ý: Có thể gán user vào các profile để giới hạn session/mỗi user, resource manager

4.4. Quản lý tablespace và Datafile

Login máy chủ database với user “oracle”, chạy lệnh sau:

$sqlplus /as sysdba

Kiểm tra dung lượng tablespace trước khi thực hiện:

SELECT  a.tablespace_name,100 - ROUND ( (NVL (b.bytes_free, 0) / a.bytes_alloc) * 100) "%Usage",

    ROUND (a.bytes_alloc / 1024 / 1024) "Size MB",

    ROUND (a.bytes_alloc / 1024 / 1024)- ROUND (NVL (b.bytes_free, 0) / 1024 / 1024) "Used MB",

    ROUND (NVL (b.bytes_free, 0) / 1024 / 1024) "Free MB",

    --ROUND ( (NVL (b.bytes_free, 0) / a.bytes_alloc) * 100) "%Free",

    ROUND (maxbytes / 1048576)  "Max MB",

    round(maxbytes/1048576-(ROUND (a.bytes_alloc / 1024 / 1024)- ROUND (NVL (b.bytes_free, 0) / 1024 / 1024)),0) "Free_MB_Max",

    ROUND (ROUND ( (a.bytes_alloc - NVL (b.bytes_free, 0)) / 1024 / 1024)/  ROUND (maxbytes / 1048576) * 100) "%Used of Max"

    FROM (SELECT f.tablespace_name, SUM (f.bytes) bytes_alloc,  SUM (DECODE (f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes

            FROM dba_data_files f

            GROUP BY tablespace_name) a,

        (SELECT f.tablespace_name, SUM (f.bytes) bytes_free  FROM dba_free_space f  GROUP BY tablespace_name) b

 WHERE a.tablespace_name = b.tablespace_name(+) 

--and  (a.tablespace_name in ('TEMP1','DATA201511','DATA2016','INDX','INDX2016'))

 order by "%Used of Max" desc;

4.4.1. Tạo mới tablespace

-         Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> create tablespace <tablespace_name> datafile <asmdisgroup or file name>  size <size> autoextend on next <size> maxsize <max size>;

Ví dụ:

SQL> create tablespace nghiepvu datafile  '+data' size 100m autoextend on next 100m maxsize unlimited;

Tablespace created.

è Kết quả trả về “Tablespace created” là thành công

4.4.2. Tạo temporary tablespace

-         Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL>create temporary tablespace <tablespace_name> tempfile   <asmdisgroup or file name>  size <size> autoextend on next <next size> maxsize <max size>;

Ví dụ:

SQL>create temporary tablespace nghiepvu_tmp tempfile '+data' size 1012m autoextend on next 200m maxsize unlimited;

Tablespace created

è Kết quả trả về “Tablespace created” là thành công

4.4.3. Thêm Datafile cho tablespace

-         Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> alter tablespace <tablespace_name> add datafile <asmdisgroup or file name>  size <size> autoextend on next <next size> maxsize <max size>;

Ví dụ:

SQL>alter tablespace nghiepvu add datafile '+data' size 100m  autoextend on next 100m maxsize unlimited;

alter tablespace nghiepvu add datafile '+data' size 25G  autoextend;

Tablespace altered.

è Kết quả trả về “Tablespace altered” là thành công

4.4.4. Thêm datafile cho temp tablespace

-         Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> alter tablespace <tablespace_name> add tempfile <asmdisgroup or file name>  size <size> autoextend on next <next size> maxsize <max size>;

Ví dụ:

SQL>alter tablespace nghiepvu_tmp add tempfile '+data' size 100m  autoextend on next 100m maxsize unlimited;

Tablespace altered.

è Kết quả trả về “Tablespace altered” là thành công

4.4.5. Drop tablespace

Một tablespace chỉ nên drop tablespace khi nó không có object nào bên trong, hoặc ở trạng thái offline.

-         Kiểm tra trạng thái của tablespace, Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> select tablespace_name, status from dba_tablespaces where tablespace_name=<tablespace name>

è Giá trị trả về “OFFLINE” có thể xóa được.

-         Kiểm tra các object đang lưu trong tablespace, chạy lệnh sau và thay tham số tương ứng

SQL>select owner, segment_name, segment_type from DBA_segments where tablespace_name=<tablespace name>

è Nếu không có bản ghi nào trả về thì có thể xóa được.

-         Để xóa tablespace, chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> drop tablespace <tablespace> including contents and datafiles;

Ví dụ:

SQL>drop tablespace nghiepvu including contents and datafiles;

Tablespace dropped.

è Kết quả trả về “Tablespace dropped” là thành công

4.4.6. Drop temp tablespace

Một tablespace chỉ có thể được drop khi nó không có object nào bên trong, hoặc ở trạng thái offline.

-         Chạy lệnh theo cú pháp sau, thay thế các tham số tương ứng:

SQL> drop tablespace <tablespace> including contents and datafiles;

Ví dụ:

SQL>drop tablespace nghiepvu including contents and datafiles;

Tablespace dropped.

è Kết quả trả về “Tablespace dropped” là thành công

4.4.7. Drop datafile

Một datafile chỉ có thể được drop khi nó không có object nào bên trong, hoặc ở trạng thái offline hoặc lỗi (Corrupt)

-         Chạy lệnh theo cú pháp sau, và thay các tham số tương ứng:

SQL>alter tablespace <tablespace_name> drop datafile  <filename> ;

Ví dụ:

SQL>alter tablespace nghiepvu drop datafile '+data/orcl/data1';

Tablespace altered.

4.4.8. Drop 1 tempfile

-         Chạy lệnh theo cú pháp sau, và thay các tham số tương ứng:

SQL>alter tablespace <tablespace_name> drop tempfile <filename> ;

Ví dụ:

SQL>alter tablespace nghiepvu_tmp tempfile '+data/orcl/tempfile/tmp.343.887649461' drop;

  Tablespace altered.

è Kết quả trả về “Tablespace altered” là thành công

2.4.9. Backup tablespace cũ theo chu kỳ

Với các dữ liệu cũ theo chu kỳ sẽ được offline, copy lên Tape/Backup tập trung và drop datafile khỏi database:

a.  Dữ liệu cần backup và restore

-         Dữ liệu cần backup: Tất cả các dữ liệu lớn về lý thuyết theo quy trình là sau 3-6 tháng backup ra tape, tuy nhiên đứng ở góc nhìn của 1 dba thì khi đã read only tablespace thì cần được backup 1 bản ra tape càng sớm càng tốt, bởi lẽ khi backup đã phải skip read only để tối ưu dung lượng và thời gian, tải hệ thống khi backup

-         Dữ liệu cần restore: Khi có yêu cầu quản trị cần phối hợp thực hiện restore từ tape

-         Phân vùng zpool làm trung gian cho quá trình backup và restore: /backup_to_tape 10TB

b. Các bước backup

B1. Read Only và Offline tablespace cũ (giả sử DATA202101, INDX202101)

Alter tablespace DATA202101 read only;

Alter tablespace DATA202101 offline;

Alter tablespace INDX202101 read only;

Alter tablespace INDX202101 offline;

 

--Dùng script check status

select distinct a.tablespace_name,b.status,b.enabled  from dba_data_files a,v$datafile b

where a.tablespace_name like '%202101%'

and b.name = a.file_name;

B2. Copy ra datafile tablespace cần backup ra tape

Select * from dba_data_files where tablespace_name  in (‘DATA202101,’INDX202101);

Select ‘asmcmd cp ‘ || file_name || ‘ /backup_to_tape/’ from dba_data_files where tablespace_name  in (‘DATA202101,’INDX202101);

 

Lệnh copy bằng user grid: asm cmd cp data_file_name file_system

Ví dụ: asmcmd cp +DATA/dbavietdb/datafile/data2021012684.1028738429 /backup_to_tape/

 

Tổ chức thư mục:

 

Note: Lưu thông tin vào file ThongKeBackupToiTape.xls

B3. Đối soát dữ liệu đảm bảo copy đầy đủ

B4. Xóa datafile khỏi database

Select ‘rm -rf ‘ || file_name || ‘;’ from dba_data_files where tablespace_name  in (‘DATA202101,’INDX202101);

 

2.4.10. Các bước restore tablespace từ tape/backup tập trung

B1. Check xem dữ liệu cần restore nằm ở tablespace nào, danh sách các datafile của TBL đó là gì, ví dụ yêu cầu restoe số liệu DATA202101, INDX202101

Select * from dba_segments where segment_name like ‘%NGHIEPVU%’ and partition_name like ‘%202101%’ => xác định được tablespace chứa dữ liệu cần restore là gì, ví dụ DATA202101 và INDX202101

Select * from dba_data_files where tablespace_name in (‘DATA202101’,’INDX202101’);=> xác định danh sách datafile

B2. Lấy datafiel từ tape xuống:

Kiểm tra file excel thongkebackup để xem đường dần backup ra tape là gì, nếu cần phối hợp thêm folder lưu log để check xem có bao nhiêu tablespace của TBL A và đã backup đủ chưa và lấy từ tape xuống phân vùng /backup_to_tape

B3. Rename datafile cho đúng với tên đang lưu trong từ điển của DB

Alter tablespace DATA202101 rename datafile A to ‘/backup_to_tape/….

Hoặc

Alter database rename file ‘A’ to ‘/backup_to_tape …’

B8. Online tablespace, select thử vào báo lại ứng dụng select, lấy dữ liệu.

Alter tablespace DATA202101 online;

Alter tablespace INDX202101 online;

 

Khi lấy xong thì offline tablspace và xóa trên san đi

 

Lưu ý: khi online lại mà có chuyển trạng thái tablespace sang readwrite bắt buộc phải tiến hành backup lại tablspace đó, nếu không sau này sẽ không online được từ bản trên tape (do last checkpoint time đã thay đổi)

4.4.11. Chuyển dữ liệu cũ từ phân vùng DATA sang RECO

(Áp dụng cho CSDL ... hoặc tương đương do diskgroup DATA tốc độ cao, dung lượng ít, diskgroup RECO tốc độ thấp, nhiều dung lượng hơn)

--1.Check dung luong: 4.825.125 GB

select round(sum(bytes)/1024/1024,2) from dba_data_files where  tablespace_name='DATA2015' and file_name not like '+BACKUP%' and file_name not like '+BACKUP%';

 

-- Dung luong   DATA con 313912 MB

select * from v$asm_diskgroup;

 

--Chuyen 640GB

select sum(bytes)/1024/1024/1024 "GB" from dba_data_files where  tablespace_name='DATA2015' and file_name not like '+RECO%'  and  file_name not like '+BACKUP%'

and file_id <= 970

order by file_id;

 

--2.Lay file_id cho cau lenh backup as copy datafile --> Chuyen Excel --> Xoay ngan va chuyen xuong muc 3.1

select file_id ||',' from dba_data_files where  tablespace_name='DATA2015' and file_name not like '+RECO%'  and file_name not like '+BACKUP%'

and file_id <= 970

order by file_id;

 

--951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970

 

--***CHAY CUOI CUNG: Lay script cau lenh xoa datafile copy

select 'DELETE DATAFILECOPY ''' || file_name || ''';'  from dba_data_files where  tablespace_name='DATA2015' and file_name not like '+RECO%'  and file_name not like '+BACKUP%'

and file_id <= 970

order by file_id;

 

--3.Thuc hien

--3.1.Backup as copy datafile: tu 14h00 - 20h55, mat 11h14', dung VNC

RMAN>run{

backup as copy datafile 951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970 format '+BACKUP';

SQL 'alter tablespace data2015 read only';

SQL 'alter tablespace data2015 offline';

SWITCH datafile 951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970 TO COPY;

recover TABLESPACE data2015;

SQL 'alter tablespace data2015 online';

}

 

--4.Check lai, dam bao da chuyen sang BACKUP

select * from dba_data_files where file_id in (951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970);

 

--+BACKUP/dbaviet/datafile/data2015.1384.913414915 921    DATA2015

--+BACKUP/dbaviet/datafile/data2015.1162.913414915 922    DATA2015

 

--5.Xoa datafile

--RMAN> run{

DELETE DATAFILECOPY '+DATA/dbaviet/datafile/data2015.1099.884530523';

DELETE DATAFILECOPY '+DATA/dbaviet/datafile/data2015.700.884530525';

}

 

4.4.12. Chuyển tablespace sang CSDL lịch sử

- Export:

expdp userid="'/ as sysdba'" parallel=8 EXCLUDE=INDEX,GRANT,CONSTRAINT,TRIGGER ESTIMATE=STATISTICS  tables=TEST_OWNER.TAB1:DATA20140501,TEST_OWNER.TAB1:DATA20140502,TEST_OWNER.TAB1:DATA20140503,TEST_OWNER.TAB1:DATA20140504,TEST_OWNER.TAB1:DATA20140505,TEST_OWNER.TAB1:DATA20140506,TEST_OWNER.TAB1:DATA20140507,TEST_OWNER.TAB1:DATA20140508,TEST_OWNER.TAB1:DATA20140509,TEST_OWNER.TAB1:DATA20140510,TEST_OWNER.TAB1:DATA20140511,TEST_OWNER.TAB1:DATA20140512,TEST_OWNER.TAB1:DATA20140513,TEST_OWNER.TAB1:DATA20140514,TEST_OWNER.TAB1:DATA20140515,TEST_OWNER.TAB1:DATA20140516,TEST_OWNER.TAB1:DATA20140517,TEST_OWNER.TAB1:DATA20140518,TEST_OWNER.TAB1:DATA20140519,TEST_OWNER.TAB1:DATA20140520,TEST_OWNER.TAB1:DATA20140521,TEST_OWNER.TAB1:DATA20140522,TEST_OWNER.TAB1:DATA20140523,TEST_OWNER.TAB1:DATA20140524,TEST_OWNER.TAB1:DATA20140525,TEST_OWNER.TAB1:DATA20140526,TEST_OWNER.TAB1:DATA20140527,TEST_OWNER.TAB1:DATA20140528,TEST_OWNER.TAB1:DATA20140529,TEST_OWNER.TAB1:DATA20140530,TEST_OWNER.TAB1:DATA20140531,TEST_OWNER.TAB1:DATA20140601,TEST_OWNER.TAB1:DATA20140602,TEST_OWNER.TAB1:DATA20140603,TEST_OWNER.TAB1:DATA20140604,TEST_OWNER.TAB1:DATA20140605,TEST_OWNER.TAB1:DATA20140606,TEST_OWNER.TAB1:DATA20140607,TEST_OWNER.TAB1:DATA20140608,TEST_OWNER.TAB1:DATA20140609,TEST_OWNER.TAB1:DATA20140610,TEST_OWNER.TAB1:DATA20140611,TEST_OWNER.TAB1:DATA20140612,TEST_OWNER.TAB1:DATA20140613,TEST_OWNER.TAB1:DATA20140614,TEST_OWNER.TAB1:DATA20140615,TEST_OWNER.TAB1:DATA20140616,TEST_OWNER.TAB1:DATA20140617,TEST_OWNER.TAB1:DATA20140618,TEST_OWNER.TAB1:DATA20140619,TEST_OWNER.TAB1:DATA20140620,TEST_OWNER.TAB1:DATA20140621,TEST_OWNER.TAB1:DATA20140622,TEST_OWNER.TAB1:DATA20140623,TEST_OWNER.TAB1:DATA20140624,TEST_OWNER.TAB1:DATA20140625,TEST_OWNER.TAB1:DATA20140626,TEST_OWNER.TAB1:DATA20140627,TEST_OWNER.TAB1:DATA20140628,TEST_OWNER.TAB1:DATA20140629,TEST_OWNER.TAB1:DATA20140630 directory=EXPTBS_ASM dumpfile='DATA201405DATA201406_EXP_FIX%U.dmp' NOLOGFILE=Y

 

- Copy file dump sang CSDL lịch sử

 

- Import:

impdp userid="'/ as sysdba'" parallel=8 REMAP_SCHEMA=TEST_OWNER:TEST_OWNER directory=IMPTBS dumpfile='DATA201405DATA201406_exp_fix%U.dmp' TABLES=TEST_OWNER.TAB1:DATA20140501,TEST_OWNER.TAB1:DATA20140502,TEST_OWNER.TAB1:DATA20140503,TEST_OWNER.TAB1:DATA20140504,TEST_OWNER.TAB1:DATA20140505,TEST_OWNER.TAB1:DATA20140506,TEST_OWNER.TAB1:DATA20140507,TEST_OWNER.TAB1:DATA20140508,TEST_OWNER.TAB1:DATA20140509,TEST_OWNER.TAB1:DATA20140510,TEST_OWNER.TAB1:DATA20140511,TEST_OWNER.TAB1:DATA20140512,TEST_OWNER.TAB1:DATA20140513,TEST_OWNER.TAB1:DATA20140514,TEST_OWNER.TAB1:DATA20140515,TEST_OWNER.TAB1:DATA20140516,TEST_OWNER.TAB1:DATA20140517,TEST_OWNER.TAB1:DATA20140518,TEST_OWNER.TAB1:DATA20140519,TEST_OWNER.TAB1:DATA20140520,TEST_OWNER.TAB1:DATA20140521,TEST_OWNER.TAB1:DATA20140522,TEST_OWNER.TAB1:DATA20140523,TEST_OWNER.TAB1:DATA20140524,TEST_OWNER.TAB1:DATA20140525,TEST_OWNER.TAB1:DATA20140526,TEST_OWNER.TAB1:DATA20140527,TEST_OWNER.TAB1:DATA20140528,TEST_OWNER.TAB1:DATA20140529,TEST_OWNER.TAB1:DATA20140530,TEST_OWNER.TAB1:DATA20140531,TEST_OWNER.TAB1:DATA20140601,TEST_OWNER.TAB1:DATA20140602,TEST_OWNER.TAB1:DATA20140603,TEST_OWNER.TAB1:DATA20140604,TEST_OWNER.TAB1:DATA20140605,TEST_OWNER.TAB1:DATA20140606,TEST_OWNER.TAB1:DATA20140607,TEST_OWNER.TAB1:DATA20140608,TEST_OWNER.TAB1:DATA20140609,TEST_OWNER.TAB1:DATA20140610,TEST_OWNER.TAB1:DATA20140611,TEST_OWNER.TAB1:DATA20140612,TEST_OWNER.TAB1:DATA20140613,TEST_OWNER.TAB1:DATA20140614,TEST_OWNER.TAB1:DATA20140615,TEST_OWNER.TAB1:DATA20140616,TEST_OWNER.TAB1:DATA20140617,TEST_OWNER.TAB1:DATA20140618,TEST_OWNER.TAB1:DATA20140619,TEST_OWNER.TAB1:DATA20140620,TEST_OWNER.TAB1:DATA20140621,TEST_OWNER.TAB1:DATA20140622,TEST_OWNER.TAB1:DATA20140623,TEST_OWNER.TAB1:DATA20140624,TEST_OWNER.TAB1:DATA20140625,TEST_OWNER.TAB1:DATA20140626,TEST_OWNER.TAB1:DATA20140627,TEST_OWNER.TAB1:DATA20140628,TEST_OWNER.TAB1:DATA20140629,TEST_OWNER.TAB1:DATA20140630 TABLE_EXISTS_ACTION=APPEND DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS

 

- Đôi soát dữ liệu:

declare

  cursor c1 is

  select owner,segment_name,partition_name,segment_type from dba_segments

  where (partition_name  like '%201405%' or partition_name  like '%201406%')

  and segment_type like '%TABLE%' and segment_name not like '%$%' and owner='TEST_OWNER'

  and (segment_name like 'TAB1' or (segment_name like ‘TAB2’ and partition_name like 'DATA20140610')) 

  order by segment_name,partition_name;

  n_rownum number;

  n_rownum_his number;

begin

-- truncate table binhtv.check_rows;

 for r1 in c1 loop

   if r1.segment_type='TABLE' then

execute immediate 'select count(*) from '||r1.owner||'.'||r1.segment_name into n_rownum;

   elsif r1.segment_type='TABLE PARTITION' then

execute immediate 'select count(*) from '||r1.owner||'.'||r1.segment_name||

' partition('||r1.partition_name||')' into n_rownum;

   end if;

 if n_rownum > 0 then

update binhtv.CHECK_ROWS set num_rows=n_rownum where table_name=r1.segment_name and par_name=r1.partition_name;

   end if;

   commit;

  end loop; 

end;

 

4.5. Quản lý Oracle parameter

Login vào máy chủ database với user “oracle”, chạy lệnh sau:

$ sqlplus / as sysdba

-         Thực hiện câu lệnh theo cú pháp sau, thay các tham số tương ứng, với kết quả tra về “System altered” là thành công

SQL> Alter system set <parameter> = <value> scope = memory|spfile|both sid='sid|*';

Ví dụ:

4.6. Quản lý Control file

Login vào máy chủ database với user “oracle”, chạy các lệnh sau:

$sqlplus / as sysdba

-         Xem thông tin các control file

SQL> show parameter control_files;

          

-         Backup control file theo cú pháp, và thay giá trị tương ứng, với kết quả trả về “Database altered” là thành công

SQL> alter database backup controlfile to <location>;

Hoặc

SQL> alter database backup controlfile to trace;

Ví dụ:

SQL> alter database backup controlfile to ‘/tmp/controlfile.sql’;

4.7. Quản lý redo log

Login vào máy chủ database với user “oracle”, chạy các lệnh sau:

$sqlplus / as sysdba

-         Tạo Redo group với database đơn, chạy lệnh theo cú pháp và thay tham số tương ứng:

SQL> alter database add logfile group <group number> (<redofile1>, <redofile2>) SIZE <size>;

Ví dụ:

SQL> alter database add logfile group 10 ('+data', '+fra') size 512m;

Database altered.

-         Tạo Redo group với database RAC, chạy lệnh theo cú pháp và thay tham số tương ứng:

SQL> alter database add logfile thread <thread number> group  <group number> (<redofile1>, <redofile2>) size <size>;

Ví dụ:

SQL> alter database add logfile thread 1 group 10 ('+redo', ‘+data’) size  512m;

Database altered.

-         Tạo Redo log member, chạy lệnh theo cú pháp và thay tham số tương ứng:

SQL> alter database add logfile member <redofile>  to group <group number>;

Ví dụ:

SQL>alter database add logfile member '+redo' to group 10;

Database altered

-         Xóa 1 Log Groups:

Chúng ta chỉ có thể xóa được Log group khi nó đã được archived và ở trạng thái inactive hoặc unsed

-         Để xác định trạng thái log grop có xóa được không:

SQL> select group#, archived, status from v$log;

-         Chuyển trạng thái Log group

Trường hợp loggroup vẫn ở trạng thái Active|Current, chạy các lệnh sau và kiểm tra lại cho đến khi trạng thái về inactive|unsed

SQL> alter system archive log current;

SQL> Alter system switch logfile;

-         Chạy lệnh theo cú pháp sau để xóa group, thay tham số tương ứng:

SQL> alter database drop logfile group <group#>;

Ví dụ:

SQL> alter database drop logfile group 10;

Database altered.

-         Xóa Redo Log Members: chạy lệnh theo cú pháp sau và thay tham số tương ứng:

Chúng ta chỉ có thể Drop được log member khi Log group của nó đã được archived và ở trạng thái  inactive|unsed. (thực hiện chuyển trạng thái log group)

SQL> alter database drop logfile member <logfile>;

Ví dụ:

SQL>Alter database drop logfile member ‘+REDO/EBGLSSP/ONLINELOG/group_9.261.1019987487’;

Database altered

4.8. Quản lý session, lock

Chạy câu lệnh sau để tìm ra các tiến trình lock:

Select /*4.Blocking_session*/ inst_id,blocking_session, sid, serial#, sql_id, wait_class, seconds_in_wait, username,STATUS,SCHEMANAME,OSUSER,MACHINE,PROGRAM,TYPE,LOGON_TIME 

From gv$session where blocking_session is not NULL and type not like 'BACKGROUND' order by inst_id;

Hoặc check chi tiết hơn về các lock:

SQL> SELECT v.sid,v.serial#,V.INST_ID,l.ORACLE_USERNAME ora_user, o.object_name, o.object_type,

DECODE(l.locked_mode,0, 'None',1, 'Null', 2, 'Row-S (SS)',3, 'Row-X (SX)',4, 'Share', 5, 'S/Row-X (SSX)',6, 'Exclusive', TO_CHAR(l.locked_mode)) lock_mode,

o.status, to_char(o.last_ddl_time,'dd.mm.yy') last_ddl

FROM dba_objects o, gv$locked_object l, gv$session v

WHERE o.object_id = l.object_id and l.SESSION_ID=v.sid order by 2,3;

Trao đổi với người quản trị và ứng dụng để tìm giảp pháp: Có thể kill, hoặc đợi cho tiến trình hoàn thành.

4.9. Kill phiên làm việc (session) treo

Chúng ta thực hiện kill 1 tiến trình khi nó bị treo, hoặc chiếm quá nhiều tài nguyễn hệ thống, hoặc theo yêu cầu cụ thể từ người dùng:

-         Chạy lệnh theo cú pháp sau, và thay các tham số tương ứng:

SQL>alter system kill session '<sid>,<serial$>,@<inst_id>';

ü  Trong đó sid,serial$, inst_id có thể được lấy từ bảng gv$session. Với Oracle đơn, chúng ta có thể bỏ qua inst_id hoặc điền giá trị 1

Ví dụ:

SQL>alter system kill session '4,1295,@2';

System altered.

è Kết quả trả về “System altered” là thành công

Các câu lệnh khác hay dùng kill -9 mức OS sẽ nhanh giải phóng tài nguyên hơn:

-- Xac dinh process tu inst_id, status, username, sql_id, machine, event,

SELECT /*username*/  'kill -9 ' || SPID A ,a.INST_ID,A.SID,A.SQL_ID, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND, A.EVENT

FROM gv$session a, gv$process b 

WHERE b.ADDR = a.paddr

AND a.inst_id=b.inst_id  

--AND B.inst_id = 1

--and a.status='INACTIVE'

--and A.USERNAME LIKE 'BINHTV%'

--AND A.USERNAME not  in ('SYS','GGATE','GOLDENGATE','CUS_CARE_GATEWAY','ORA_RECO_070361')

--and a.username not in ('SYS','SYSTEM','SYSMAN','BINHTV','DBSNMP','GGATE','GOLDENGATE','CUS_CARE_GATEWAY','CLOSECYCLE','KHUYENMAI','TRIEUNV','SONTQ','PHONGNT','THAMSOHOA','KHOASO','TRIEUNV','ACT_DEA_SUBS','RED_WARNING')

and a.username not in ('REPORT')

--AND a.program LIKE '%rman%'

--AND sql_id in ('gtsw86x47z0au')

--and machine  like '%HCM%'

and a.event in  ('library cache lock','library cache load lock','library cache: mutex X','cursor: pin S wait on X','library cache pin','library cache lock','library cache: mutex X','gc buffer busy acquire','enq: TS - contention','enq: TX - row lock contention','enq: TM - contention','db file parallel read','row cache lock','enq: DX - contention','enq: US - contention','enq: TX - allocate ITL entry','enq: TX - index contention','enq: SQ - contention','enq: TX - row lock contention','PL/SQL lock timer')

--and  round(to_number(sysdate-a.prev_exec_start)*1440) >30  

and type='USER'

order by a.inst_id;

 

SELECT /*SID*/  'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,a.prev_exec_start,BACKGROUND

FROM gv$session a, gv$process b

WHERE b.addr = a.paddr  

AND a.inst_id=b.inst_id

--and b.inst_id=2

AND a.sid in (

13562

)

and type='USER'

and machine  not like '%BINHTV%' --and user not like 'SYS'

order by inst_id;

 

SELECT /*call package*/  'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,a.prev_exec_start,BACKGROUND

FROM gv$session a, gv$process b

WHERE b.addr = a.paddr  

AND a.inst_id=b.inst_id

--and b.inst_id=4

AND (b.inst_id, a.sid) in (

(select /*+ parallel(8) */  inst_id, sid from gv$access where object like '%CLOSE_CYCLE%')

)

and type='USER'

and a.machine not like '%BINHTV%' ;

 

select /*+ parallel(8) */  inst_id, sid from gv$access where object like '%CLOSE_CYCLE%';

 

SELECT /*lock table*/  'kill -9 ' || spid a, a.INST_ID,A.SQL_ID,A.SID, A.SERIAL#, a.USERNAME, a.STATUS,A.SCHEMANAME,a.OSUSER,A.MACHINE,A.PROGRAM,A.TYPE,A.LOGON_TIME,BACKGROUND

FROM gv$session a, gv$process b

WHERE b.addr = a.paddr  

AND a.inst_id=b.inst_id

--and b.inst_id=3

AND (b.inst_id, a.sid) in

(SELECT /*+ parallel(8)*/ s.inst_id,s.sid

FROM gv$locked_object v, dba_objects d,

gv$lock l, gv$session s

WHERE v.object_id = d.object_id

AND (v.object_id = l.id1)

AND v.session_id = s.sid

and object_name=upper('SCRATCH'))

--and type='USER'

--ORDER BY username, session_id;

 

select /*+ parallel(8) */ sid||','from gv$access where upper(object) like upper('MC_SUBSCRIBER')

--and inst_id=1;

 

 SELECT v.sid,v.serial#,V.INST_ID,l.ORACLE_USERNAME ora_user, o.object_name, o.object_type,

DECODE(l.locked_mode,0, 'None',1, 'Null', 2, 'Row-S (SS)',3, 'Row-X (SX)',4, 'Share', 5, 'S/Row-X (SSX)',6, 'Exclusive', TO_CHAR(l.locked_mode)) lock_mode,

o.status, to_char(o.last_ddl_time,'dd.mm.yy') last_ddl

FROM dba_objects o, gv$locked_object l, gv$session v

WHERE o.object_id = l.object_id and l.SESSION_ID=v.sid order by 2,3;

 

-- Xac dinh user dang chay cau lenh SQL nao

select  p.INST_ID, 'kill -9 '||P.SPID SPID, s.SID, s.username su, substr(sa.sql_text,1,540) SQL_TEXT

from gv$process p,gv$session s,gv$sqlarea sa

where p.addr=s.paddr and p.INST_ID=s.INST_ID and s.username is not null and s.sql_address=sa.address(+) and s.sql_hash_value=sa.hash_value(+)

and s.username=upper('CALLCENTER_BEA')

and type='USER'

order by INST_ID, SID;

4.10. Quản lý Archived log

Chúng ta thực hiện xóa Archived log khi cần để giải phóng tài nguyên.

-         Truy nhập vào máy chủ database với user “oracle” và chạy câu lệnh như dưới. Nếu câu lệnh chạy thành công không báo lỗi “error” là đạt.

$ su - oracle

$ rman target /

-         Xóa toàn bộ các file archived:

RMAN> delete noprompt archivelog all;

-         Trường hợp muốn xóa force ta thêm ‘force’ sau câu lệnh Delete:

RMAN>delete force noprompt archivelog all;

-         Xóa các file archived đã expired:

RMAN> delete noprompt expired archivelog all;

-         Xóa các file archived và chỉ giữ lại 1 số ngày nhất định (ví dụ giữ lại 1 ngày):

RMAN> delete noprompt archivelog until time 'trunc(sysdate-1)';

-         Xóa các file archived đã được backup, trước ngày hiện tại 1 ngày:

RMAN> delete archivelog until time 'trunc(sysdate-1)' backed up 1 times to device type disk;

4.11. Rebuild Index

Thực hiện rebuild lại index khi index đó dùng lâu không hiệu quả. Do các hoạt động delete/update:

-         Rebuild index không partition: Chạy lệnh theo cú pháp sau và thay các tham số tương ứng với kết quả trả về “Index rebuild” là thành công:

SQL> ALTER INDEX <index name> REBUILD;

Ví dụ:

SQL> ALTER INDEX OPS.idx1 REBUILD;

Index rebuild.

è Kết quả trả về “Index rebuild” là thành công

-         Rebuild index partition:

SQL> alter index <index_name> partition DATA20220315 rebuild tablespace DATA202203 nologging parallel 8 online;

alter index <index_name> noparallel;

4.12. Compile object

-         Truy nhập vào máy chủ database với user “oracle”, chạy lệnh sau:

$ sqlplus /as sysdba

-         Để compile lại toàn bộ các object, chạy lệnh sau với kết quả “PL/SQL procedure successfully completed” là thành công:

SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql;

Hoặc kiểm tra invalid theo user:

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 'USER1'

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 'USER1';

-         Để compile các object, chạy lệnh theo cú pháp sau và thay các tham số tương ứng với kết quả trả về “altered” là thành công:

SQL>Alter package <package name> compile;

SQL>Alter package <package name> compile body;

SQL>Alter procedure <procudure name> compile;

SQL>Alter function <function name> compile;

SQL>Alter trigger <trigger name> compile;

SQL>Alter view <view name> compile;

Ví dụ:

SQL>Alter package Dbaviet.Pck_test compile;

SQL>Alter package Dbaviet.Pck_test compile body;

SQL>Alter procedure Dbaviet.Prc_test compile;

SQL>Alter function Dbaviet.Fnc_test compile;

SQL>Alter trigger Dbaviet.Trg_test compile;

SQL>Alter view Dbaviet.VW_test compile;

4.13. Điều chỉnh cấp phát RAM/Process cho database

-         Điều chỉnh cấp phát RAM cho database

Trong quá trình vận hành và đánh giá hoạt động của database, nếu bộ nhớ RAM của database báo thiếu hoặc không sử dụng đến, chúng ta có thể điều chỉnh tham số bộ nhớ RAM khi cấp cho database để sử dụng bộ nhớ hiệu quả. Chủ yếu thay đổi bộ nhớ RAM cho: sga và pga.

Để thay đổi bộ nhớ RAM cho SGA thực hiện như sau:

+ Đối với database RAC:

SQL> alter system set sga_target=<Dung lượng >G scope=spfile sid=’*’;

SQL> alter system set sga_max_size=<Dung lượng >G scope=spfile sid=’*’;

+ Đối với database đơn:

SQL> alter system set sga_target=<Dung lượng >G scope=spfile;

SQL> alter system set sga_max_size=<Dung lượng >G scope=spfile;

Để thay đổi bộ nhớ RAM cho PGA thực hiện như sau:

+ Đối với database RAC:

SQL> alter system set pga_aggregate_limit=<Dung lượng >G scope=spfile sid=’*’;

+ Đối với database đơn:

SQL> alter system set pga_aggregate_limit=<Dung lượng >G scope=spfile;

-         Điều chỉnh process cho database

Trong quá trình vận hành database, có thể hệ thống báo thiếu tiến trình xử lý trên database nên cần bổ sung thêm tiến trình để database hoạt động tốt hơn. Để thay đổi giá trị process cho database ta thực hiện như sau:

+ Đối với database RAC:

SQL> alter system set processes =<giá trị cần thay đổi> scope=spfile sid=’*’;

+ Đối với database đơn:

SQL> alter system set processes =<giá trị cần thay đổi> scope=spfile ;

4.14. Quản lý Disk, diskgroup ASM

Login vào máy chủ database với user “grid”, chạy các lệnh sau:

$ sqlplus / as sysasm

-         Mount diskgroup

Có thể vì lý do nào đó mà 1 diskgroup ở trạng thái nomount.

Chạy lệnh theo cú pháp sau và thay tham số tương ứng

SQL> alter diskgroup <diskgroup name> mount;

Ví dụ:

SQL> alter diskgroup +DATA01 mount;

Diskgroup altered.

è Kết quả trả về “Diskgroup altered” là thành công

-         Dismount diskgroup

Chạy lệnh theo cú pháp sau và thay tham số tương ứng

SQL> alter diskgroup <all|diskgroup name> dismount force;

Ví dụ:

SQL> alter diskgroup +DATA01 dismount force;

Diskgroup altered.

è Kết quả trả về “Diskgroup altered” là thành công

4.14.1. Create/Drop DISKGROUP ASM

Login vào máy chủ database với user “grid”, chạy các lệnh sau:

$ sqlplus / as sysasm

-         Để tạo 1 diskgroup

Chạy lệnh theo cú pháp sau và thay các tham số tương ứng:

SQL> create diskgroup <Diskgroup name> external|normal|high redundancy disk  <disk path>;

Ví dụ:

SQL> create diskgroup DATA01 external redundancy disk '/dev/mapper/*';

-         Để drop 1 diskgroup

Người quản trị chỉ có thể drop được 1 diskgroup khi diskgroup đó ở trạng thái dismount, và không chứa spfile của ASM

ü  B1: Kiểm tra spfile thuộc diskgroup nào

SQL> show parameter spfile;

ü  B2: Nếu spfile không thuộc DISKGROUP cần xóa

Thực hiện diskmount diskgroup theo cú pháp sau và thay tham số tương ứng

SQL> alter diskgroup <Diskgroup> dismount force;

Ví dụ:

SQL> alter diskgroup OCRVOTE02 dismount force;

Diskgroup altered.

ü  B3: Thực hiện drop diskgroup, chạy lệnh theo cú pháp sau và thay tham số tương ứng:

SQL> drop diskgroup <Diskgroup> force including contents;

Ví dụ:

SQL> drop diskgroup OCRVOTE02 force including contents;

Diskgroup drop.

ü  B4: Nếu spfile thuộc DISKGROUP cần xóa.

Tạo pfile mới, start lại ASM và chuyển spfile sang disk group mới. Rồi thực hiện tiếp các bước B2, B3

Chạy các lệnh sau trên tất cả các máy chủ database, thay thế tham số tương ứng;

SQL> create pfile=<pfile>;

SQL> Shutdown immediate

SQL> startup pfile=<pfile>;

SQL> create spfile=<new diskgroup> from pfile=<pfile>;

Ví dụ:

SQL> create pfile='/tmp/init+ASM.ora'

SQL> Shutdown immediatestartup

SQL> startup pfile='/tmp/init+ASM.ora'

SQL> create spfile='+DATA01' from pfile='/tmp/init+ASM.ora';

ü  B5: Kiểm tra quá trình thực hiện drop diskgroup

SQL> select * from v$asm_operation ;

è Kết quả trả về “no rows selected” là quá trình remove thành công

4.14.2. Thực hiện add disk trên OS

Khi được cấp phát thêm disk cho database thì phía OS phải thực hiện các công việc sau với user ‘root’:

-         Xác định WWID của các disk thêm vào

Thực hiện lệnh theo cú pháp sau với tất cả các phân vùng dữ liệu cấp phát, trong đó <LUNID> là ID của disk được đội Lưu trữ gán cho database

# multipath -ll |grep <LUNID>

Ví dụ

# multipath -ll |grep 9b0c7f2480f740d600011411

(3624a93709b0c7f2480f740d600011411) dm-4 FlashArray

è Phần kết quả 3624a93709b0c7f2480f740d600011411 tương ứng với WWID.

-         Thêm thông tin Disk mới vào Multipath

# vi /etc/multipath.conf

Thêm vào dòng như bên dưới và thay các tham số tương ứng

multipaths {

   multipath {

              wwid                   <WWID disk>

              alias               < Alias Name>

           path_grouping_policy multibus

                path_selector           "round-robin 0"

                failback            immediate

                rr_weight           priorities

                no_path_retry       5

}

}

Ví dụ:

multipaths {

   multipath {

            wwid               3624a93709b0c7f2480f740d600011411

            alias               DATA03

           path_grouping_policy multibus

                path_selector           "round-robin 0"

             failback            immediate

             rr_weight           priorities

             no_path_retry       5

}

}

Format DISK

-         Dưới đây là các bước thực hiện format phân vùng /dev/mapper/DATA03.

# fdisk /dev/mapper/DATA03

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel with disk identifier 0xd94a4a6b.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.

   Command (m for help): n

Command action

 

   e   extended

   p   primary partition (1-4)

p

 

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').

 

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-19450, default 1):

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-19450, default 19450):

Using default value 19450

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

-         Kiểm tra lại phân vùng vừa format

# partprobe /dev/mapper/DATA03

# ls -l /dev/mapper |grep DATA03

è Hiển thị kết quả các phân vùng DATA03

lrwxrwxrwx 1 root root   7 Sep 18 09:44 DATA03 -> ../dm-4

-         Thay đổi quyền cho disk đã format

# vi /etc/udev/rules.d/99-oracle-asmdevices.rules

àThêm vào các dòng sau:

KERNEL=="dm-*",ENV{DM_NAME}=="DATA03p1",

OWNER:="grid", GROUP:="asmadmin", MODE:="0660"

 

-         Khởi đông lại dịch vụ multipath

# systemctl restart multipathd.service

# ps -ef |grep multipathd

-         Kiểm tra cấp quyền

# ls -l /dev/dm-*

è Những disk có kết quả hiển thị “grid asmadmin” là đã được cấp quyền thành công

4.14.3. Add disk vào ASM group

Login vào máy chủ database với user “grid”, chạy lệnh sau:

$ sqlplus / as sysasm

Chạy lệnh theo cú pháp sau và thay các tham số tương ứng

SQL> alter diskgroup <diskgroup> add disk <disk path>;

è Kết quả trả về “Diskgroup altered” là thành công.

Ví dụ:

SQL> alter diskgroup DATA01 add disk '/dev/mapper/DATA01p1';

Diskgroup altered

4.14.4. Drop disk trong diskgroup

Login vào máy chủ database với user “grid”, chạy các lệnh sau:

$ sqlplus / as sysasm

Chúng ta chỉ drop được disk khi dung lượng còn trống của diskgroup đó lớn hơn dung lượng disk cần drop.

Để thực hiện chúng ta thực hiện lệnh theo cú pháp sau và thay các tham số tương ứng:

ü  B1: Xác định thông tin diskgroup: Dung lượng group#, free_MB

SQL>Select group_number, name, type, total_mb, free_mb from v$asm_diskgroup;

 

ü  B2: Xác định disk cần xóa khỏi group. Chạy lệnh theo cú pháp và thay tham số tương ứng

SQL> select mount_status, header_status, mode_status,state, total_mb, free_mb,  name, path, label from v$asm_disk where group_number=<group#>

ü  B3: Thực hiện remove disk, chạy lệnh theo cú pháp sau

SQL> alter diskgroup <diskgroup> drop disk <diskname>;

Ví dụ:

SQL> alter diskgroup DATA02 drop disk '/dev/mapper/DATA02p1';

ü  B4: Kiểm tra quá trình chạy remove

SQL> select * from v$asm_operation ;

è Kết quả trả về “no rows selected” là quá trình remove thành công

ü  B5: Kiểm tra lại các diskà Không còn disk đã remove

4.14.5. Thủ tục  add ổ đĩa mới vào diskgroup DATA trong Solaris của cơ sở dữ liệu Oracle

 

 16. c0t60060E80075AA60000305AA600000085d0 <HITACHI-OPEN-V      -SUN-8001-1.80TB>

          /scsi_vhci/disk@g60060e80075aa60000305aa600000085

 

-- Check tu lenh

root@db1 # ls -lL /dev/rdsk/c0t60060E80075AA60000305AA600000085d0*

crw-r-----   1 root     sys      118, 423 Jul 22 10:28 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0

crw-r-----   1 root     sys      118, 416 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

crw-r-----   1 root     sys      118, 417 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s1

crw-r-----   1 root     sys      118, 418 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s2

crw-r-----   1 root     sys      118, 419 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s3

crw-r-----   1 root     sys      118, 420 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s4

crw-r-----   1 root     sys      118, 421 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s5

crw-r-----   1 root     sys      118, 422 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

1. Yêu cầu disk

DATA, RECO -- Bỏ 34 Sector đầu tiên trong solaris vì ghi vào bị lỗi

 selecting c0t60060E80075AA60000305AA600000085d0

 Total disk sectors available: 3865454302 + 16384 (reserved sectors)

 

partition> p

Current partition table (original):

Total disk sectors available: 3865454116 + 16384 (reserved sectors)

 

Part      Tag    Flag     First Sector          Size          Last Sector

  0        usr    wm                34         1.80TB           3865454149 

  1 unassigned    wm                 0            0                0 

  2 unassigned    wm                 0            0                0 

  3 unassigned    wm                 0            0                0 

  4 unassigned    wm                 0            0                0 

  5 unassigned    wm                 0            0                0 

  6 unassigned    wm                 0            0                0 

  8   reserved    wm        3865454150         8.00MB           3865470533   

 

2. GÁN QUYỀN TRỂN CẢ 2 NODE (USER ROOT)

 16. c0t60060E80075AA60000305AA600000085d0 <HITACHI-DF600F-0000-1.83TB>  DATA09

 

(root)# ls -lL /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0;

 crw-r-----   1 root     sys      118, 416 Jul 22 09:14 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

(root)# chown -R oracle:asmadmin /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

(root)# ls -lL /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 crw-r-----   1 oracle   asmadmin 118, 94 May 11 16:13 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

(root)# chmod  660 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

-- Check lai dam bao du quyen crw-rw----

root # ls -lL /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 crw-rw----   1 oracle   asmadmin 118, 94 May 11 16:13 /dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0

 

3. Add disk: 

-- Check node tai thap de add

prstat -Z

 

oracle$ . grid

sqlplus / as sysasm

 SQL-ASM> ALTER DISKGROUP DATA REBALANCE POWER 4;

 SQL-ASM> ALTER DISKGROUP DATA ADD DISK '/dev/rdsk/c0t60060E80075AA60000305AA600000085d0s0';

 

4. MONITORING

(oracle)$ iostat -xnz 3 | egrep 'device|c0t60060E80075AA60000305AA600000085d0'

--(Write 108MB/s)

                    extended device statistics           

    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device

     4.6  111.4 1440.7 108981.5  0.0  0.9    0.0    7.9   0  31 c0t60060E80075AA60000305AA600000085d0

 

(oracle)$ . grid

(oracle)$ sqlplus / as sysasm

SQL-ASM> select INST_ID, OPERATION, STATE, POWER, SOFAR, EST_WORK, EST_RATE, EST_MINUTES from GV$ASM_OPERATION;

 

-- Dam bao EST_MINUTES=0

 INST_ID OPERA STAT      POWER      SOFAR   EST_WORK   EST_RATE EST_MINUTES

---------- ----- ---- ---------- ---------- ---------- ---------- -----------

         2 REBAL RUN           4     296441     296441       1094           0

         1 REBAL WAIT          4

 

5. CHUYEN POWER VE 1 SAU KHI REBALANCE XONG

 

SQL-ASM> ALTER DISKGROUP DATA REBALANCE POWER 1;

4.14.6. Thủ tục add đĩa vào diskgroup DATA trong AIX trong ASM

--Đổi tên giữa 2 hdisk: rendev -l hdisk33 -n hdisk58

1. Cấu hình

-- Thuc hien tren ca 2 node, root

lspath -l hdisk25

lsattr -El hdisk25

chdev -l hdisk25 -a reserve_policy=no_reserve

chdev -l hdisk25 -a algorithm=round_robin

chdev -l hdisk25 -a queue_depth=32

lsattr -El hdisk25

1ls -l /dev/rhdisk25

chown oracle.oinstall /dev/rhdisk25 (khi cài riêng grid có thể gán quyền là chown grid.asmadmin /dev/rhdisk25)

chmod 660 /dev/rhdisk25

ls -l /dev/rhdisk25

crw-rw----    1 oracle oinstall      24, 64 Nov 30 17:57 /dev/rhdisk25

(hoặc crw-rw----    1 grid asmadmin      24, 64 Nov 30 17:57 /dev/rhdisk25)

2. Add đĩa vào group DATA

. grid

 

sqlplus / as sysasm

alter diskgroup DATA add disk '/dev/rhdisk25';

exit

asmcmd lsop

asmcmd lsdg

asmcmd lsdsk

SQL-ASM> ALTER DISKGROUP DATA REBALANCE POWER 4;

SQL-ASM> select INST_ID, OPERATION, STATE, POWER, SOFAR, EST_WORK, EST_RATE, EST_MINUTES from GV$ASM_OPERATION;

SQL-ASM> ALTER DISKGROUP DATA REBALANCE POWER 1;

Note: Có thể dùng GUI để thêm disk

Bat Xmanager

export DISPLAY=10.151.197.234:0

dbca

4.15. Quản trị vận hành multitenants database

Truy nhập vào máy chủ database với user “oracle”

-         Kiểm tra trạng thái của các PDB bằng lệnh:

$sqlplus / as sysdba

SQL> show pdbs

Ví dụ:

-         Kiểm tra đang kết nối với CDB hay PDB bằng lệnh

SQL>select sys_context ('userenv', 'con_name') from dual;

à CDB$ROOT: Là đang ở mức Container;

-         Chuyển giữa các database (CDB, PDB);

Chạy lệnh sau và thay tham số tương ứng

SQL> alter session set container = <pdb_name>;

SQL> alter session set container = CDB$ROOT;

Session altered.

-         Start/Stop Pluggable database

ü  Open Read write PDBs, chạy lệnh theo cú pháp:

SQL> alter pluggable database <pdb_name> open;

ü  Open Read Only PDBs, chạy lệnh theo cú pháp:

SQL> alter pluggable database <pdb_name> open read only;

ü  Stop PDBs bằng lệnh PDBs, chạy lệnh theo cú pháp:

SQL> alter pluggable database <pdb_name> close immediate;

Ví dụ:

4.15.1. Create Pluggable database

Truy nhập vào máy chủ database với user “oracle” và sử dụng một trong hai cách sau

Cách 1: Tạo Plugdatabase bằng command theo cú pháp sau, với kết quả trả về “Pluggable database created” là thành công.

$sqlplus / as sysdba

SQL> create pluggable database <pdb name> admin user <pdb user> identified by <pass>;

Ví dụ:

 

Cách 2:Dùng dbca tạo database theo các bước như hình dưới đây

$dbca

 

-         Chọn “Manage Pluggable Database” rồi chọn Next

 

-         Chọn “Create a Pluggable Database” rồi chọn Next

 

-         Nhập vào User name/Password rồi chọn Next

-         Chọn  Next

 

-         Nhập vào các thông tin rồi chọn Next

-         Chọn  Next

 

-         Chọn Finish

 

 

 

 

-         Chọn Close

4.15.2. Drop Pluggable database

Truy nhập vào máy chủ database với user “oracle” và sử dụng một trong hai cách sau

Cách 1: Tạo Plugdatabase bằng command theo cú pháp sau:

$sqlplus / as sysdba

SQL> Drop pluggable database <pdb name> including|keep datafiles;

Ví dụ:

 

Cách 2: Dùng dbca tạo database theo các bước như hình dưới đây

$dbca

-         Chọn “Manage Pluggable Database” rồi chọn “Next”

                                 

-         Chọn “Delete a Pluggable database” rồi chọn Next

 

 

 

 

 

 

-         Nhập vào User name/Password rồi chọn Next

 

-         Chọn Pluggable database cần xóa, rồi chọn Next

 

 

 

 

 

-         Chọn Finish

 

-         Chọn Close

 

4.16. Gather statistics

-         Gather cả database: Với kết quả trả về “PL/SQL procedure successfully completed.” là thành công

SQL> exec dbms_stats.gather_database_stats;

4.16.1. Gather cả DB

CREATE OR REPLACE PACKAGE BODY TEST_OWNER.pck_gather_table_stats

IS

    p_error     VARCHAR2 (1000);

    p_gather_date_par   DATE := SYSDATE;

    p_gather_date   DATE := SYSDATE;

 

PROCEDURE exec_gather_tables

IS

BEGIN

        -- Bảng unpartitioned dữ 

        IF (TO_NUMBER(TO_CHAR (SYSDATE, 'dd')) IN (1,5,11,15,21,25) and (to_number(to_char(sysdate,'hh24')) < 7 or to_number(to_char(sysdate,'hh24')) > 22))

        THEN

            pck_gather_table_stats.gather_unpartitioned_tables;

        END IF;

         pck_gather_table_stats.gather_partitioned_tables();

        

END;

 

PROCEDURE gather_partitioned_tables

IS

        CURSOR c_partitioned_tables

        IS

            SELECT   table_owner, table_name, partition_name, last_analyzed,

                        'begin

                                dbms_stats.gather_table_stats

                                (ownname=>''' || TABLE_OWNER || ''',

                                tabname=>''' || table_name || ''',

                                partname=>''' || partition_name || ''',

                                estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,

                                method_opt => ''FOR ALL COLUMNS SIZE AUTO'',

                                cascade=>true,

                                degree=>10);

                                end;

                            '

                         script

                FROM   all_tab_partitions

               WHERE   

   table_owner='TEST_OWNER'

   and table_name not like '%XXX%' and table_name not like '%TMP%' and table_name not like '%TEMP%' and table_name not like '%TEST%' and table_name not like '%$%'             

   AND  (last_analyzed is null or num_rows is null)

   and ((length(partition_name) = 12 AND to_date(substr(partition_name,5,8),'YYYYMMDD')<trunc(sysdate)

              AND to_date(substr(partition_name,5,8),'YYYYMMDD')>trunc(sysdate)-60

         )

        or (length(partition_name) =10 AND to_date(substr(partition_name,5,6),'YYYYMM')<trunc(sysdate)

            AND to_date(substr(partition_name,5,6),'YYYYMM')>=add_months(trunc(sysdate,'month'),-2)

            )

        )

and partition_name like '%2021%'

ORDER BY   table_name, partition_name;

 

        v_table_name   VARCHAR2 (100);

        v_par_name VARCHAR2 (100);

BEGIN

        FOR v_partitioned_tables IN c_partitioned_tables

        LOOP

            IF (TO_NUMBER (TO_CHAR (SYSDATE, 'dd')) NOT IN(0)) and (to_number(to_char(sysdate,'hh24')) < 7 or to_number(to_char(sysdate,'hh24')) > 22)

            THEN

            v_table_name := v_partitioned_tables.table_name;

            v_par_name := v_partitioned_tables.partition_name;

 

            EXECUTE IMMEDIATE v_partitioned_tables.script;

--            pr_insert_log_gather(v_partitioned_tables.table_owner, v_partitioned_tables.table_name, v_partitioned_tables.partition_name,v_partitioned_tables.script);

            end if;

        END LOOP;

EXCEPTION

        WHEN OTHERS

        THEN

            null;

END;

 

    -- Gather stats for unpartitioned tables

-- Input:

-- p_Owner: Owner of tables

-- p_Ignored_Tables_List: List of Tables that will not be gathered

-- Output

-- p_Gathered_Tables: Tables already gathered

-- p_Error: Errors descriptions(if any), NULL value means no error occurred

    PROCEDURE gather_unpartitioned_tables

IS

        CURSOR c_tables

        IS

              SELECT   owner, table_name, last_analyzed,

                       'begin

                                dbms_stats.gather_table_stats

                                (ownname=>''' || OWNER || ''',

                                tabname=>''' || table_name || ''',

                                estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,

                                method_opt => ''FOR ALL COLUMNS SIZE AUTO'',

                                cascade=>true,

                                degree=>10);

                                end;

                            '

                           script

                FROM   dba_tables

               WHERE   partitioned = 'NO'               

                       AND tablespace_name IS NOT NULL

                       AND table_name NOT LIKE '%$%'

                       AND table_name not  like '%XX%'

                       and table_name not  like '%BK%'

                       and owner in ('TEST_OWNER')

                      --AND NVL (last_analyzed, SYSDATE - 15) < p_gather_date

                       AND  (last_analyzed is null or num_rows is null)

            ORDER BY   last_analyzed;

 

        v_table_name   VARCHAR2 (100);

BEGIN

 

        FOR v_tables IN c_tables

        LOOP

            v_table_name := v_tables.table_name;

 

            EXECUTE IMMEDIATE v_tables.script;

--            pr_insert_log_gather(v_tables.owner, v_tables.table_name, null,v_tables.script);

        END LOOP;

  EXCEPTION

        WHEN OTHERS

        THEN

            null;

END;

 

--------------------------------------------------------------------------------

END;

/

4..16.2. Gather mức schema:

Chạy lệnh theo cú pháp sau và thay các tham số tương ứng. Với kết quả trả về “PL/SQL procedure successfully completed.” là thành công

SQL> exec dbms_stats.gather_schema_stats(<schema>);

Ví dụ:

SQL> exec dbms_stats. gather_schema_stats ('Nghiepvu');

PL/SQL procedure successfully completed.

4..16.3. Gather mức tables:

Chạy lệnh theo cú pháp sau và thay các tham số tương ứng. Với kết quả trả về “PL/SQL procedure successfully completed.” là thành công

SQL>exec dbms_stats.gather_table_stats(<schema>, <tablename>);

Ví dụ:

SQL> exec dbms_stats. gather_schema_stats ('Nghiepvu',TAB1);

PL/SQL procedure successfully completed.

BEGIN

  SYS.DBMS_STATS.GATHER_TABLE_STATS (

      OwnName    => 'TEST_OWNER

     ,TabName    => ‘TAB1'

    ,Estimate_Percent  => 10

    ,Method_Opt    => 'DBMS_STATS.AUTO_SAMPLE_SIZE'

    ,Degree        => 4

    ,Cascade       => TRUE

,No_Invalidate     => FALSE);

END;

4.16.4. Gather bảng to có partition:

SELECT   table_name, partition_name, last_analyzed,

           'exec dbms_stats.gather_table_stats(ownname =>'''||table_owner||''',tabname =>'''||table_name||''',partname'||'=>'''

      || PARTITION_NAME

      || ''',granularity=>''partition'',cascade=> TRUE,force=>TRUE,estimate_percent=>10,'

      || 'method_opt=>''FOR ALL COLUMNS SIZE AUTO'',degree => 8);'

                         script

                FROM   dba_tab_partitions

               WHERE   table_name  in ('TAB1,'TAB2')

                       and table_owner in ('TEST_OWNER')         

                       AND  (last_analyzed is null or num_rows is null)    

                       and partition_name like '%2018%'

                        --AND  and ((length(partition_name) = 12 AND to_date(substr(partition_name,5,8),'YYYYMMDD')<= trunc(sysdate)            

         )

        or (length(partition_name) =10 AND to_date(substr(partition_name,5,6),'YYYYMM')<=trunc(sysdate)

            )

        )                         

            ORDER BY   table_name, partition_name;

Exec sys.send_sms_binhtv

4.16.5. Script hay dùng khác:

Script gather bảng non-partition STALE

SELECT /* GATHER TABLE NON-PARTITION STALE  */    table_name, partition_name, last_analyzed,

                        'begin

                                dbms_stats.gather_table_stats

                                (ownname=>''' || OWNER || ''',

                                tabname=>''' || table_name || ''',

                                estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,

                                method_opt => ''FOR ALL COLUMNS SIZE AUTO'',

                                cascade=>true,

                                degree=>10);

                                end;' script

from dba_tab_statistics a

where owner = 'BINHTV' 

and table_name not like 'XXX%' and table_name not like 'TMP%' and (stale_stats is null or stale_stats = 'YES') and object_type = 'TABLE'

--and table_name in ('TAB1','TAB2') 

and not exists (select 1 from  dba_tab_statistics where owner = a.owner and table_name = a.table_name and object_type = 'PARTITION' and rownum < 2)

order by 1,2 desc; 

 

Script gather bảng partition STALE 2021

SELECT   table_name, partition_name, last_analyzed,num_rows,

   'begin dbms_stats.gather_table_stats(ownname =>'''||owner||''',tabname =>'''||table_name||''',partname'||'=>'''

 || PARTITION_NAME

 || ''',granularity=>''partition'',cascade=> TRUE,force=>TRUE,estimate_percent=>10,'

 || 'method_opt=>''FOR ALL COLUMNS SIZE AUTO'',degree => 8); end;'

 script

FROM   dba_tab_statistics

where  

owner='USER1'

--and table_name in ('TAB1')      

--and num_rows<10000000

and partition_name is not null

and partition_name like '%2021%'

 and ((length(partition_name) = 12 AND to_date(substr(partition_name,5,8),'YYYYMMDD')<= trunc(sysdate)            

         )

        or (length(partition_name) =10 AND to_date(substr(partition_name,5,6),'YYYYMM')<=trunc(sysdate)

            )

        )

and (stale_stats='YES' or stale_stats is null);


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
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/DBAVietNam
👨 Website: https://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

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

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