asm
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| asm [2018/12/08 12:49] – created 0.0.0.0 | asm [2025/02/12 15:28] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== ASM ====== | + | * [[https:// |
| + | * [[https:// | ||
| - | =====Useful ASM commands===== | + | ==== How to shutdown a standalone ASM instance in oracle ==== |
| - | * [[https:// | + | * First we need to bring down the databases that rely on it |
| - | =====Migrate From Database File system to ASM===== | + | < |
| - | * [[https:// | + | [oracle@oracle ~]$ ps -ef|grep pmon |
| - | =====See what disk groups exist===== | + | grid |
| - | < | + | oracle |
| - | =====Check space available in disk groups | + | oracle |
| - | < | + | [oracle@oracle ~]$ sqlplus |
| - | =====See how the disk groups are linked to their paths===== | + | |
| - | < | + | SQL*Plus: Release 12.1.0.2.0 Production on Thu Feb 9 20:10:36 2017 |
| + | |||
| + | Copyright (c) 1982, 2014, Oracle. | ||
| + | |||
| + | Enter user-name: / as sysdba | ||
| + | |||
| + | Connected to: | ||
| + | Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production | ||
| + | With the Partitioning, | ||
| + | and Real Application Testing options | ||
| + | |||
| + | SQL> shut immediate; | ||
| + | Database closed. | ||
| + | Database dismounted. | ||
| + | ORACLE instance shut down. | ||
| + | SQL> exit; | ||
| + | Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production | ||
| + | With the Partitioning, | ||
| + | and Real Application Testing options | ||
| + | [oracle@oracle ~]$ ps -ef|grep pmon | ||
| + | grid | ||
| + | oracle | ||
| + | </ | ||
| + | * Shutdown the ASM instance | ||
| + | Now db has been down next switch to grid user and bring down the ASM instance with sysasm privilege. | ||
| + | < | ||
| + | [oracle@oracle ~]$ su - grid | ||
| + | Password: | ||
| + | Last login: Thu Feb 9 20:02:32 PST 2017 on pts/0 | ||
| + | [grid@oracle ~]$ sqlplus | ||
| + | |||
| + | SQL*Plus: Release 12.1.0.2.0 Production on Thu Feb 9 20:13:24 2017 | ||
| + | |||
| + | Copyright (c) 1982, 2014, Oracle. | ||
| + | |||
| + | Enter user-name: / as sysasm | ||
| + | |||
| + | Connected to: | ||
| + | Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production | ||
| + | With the Automatic Storage Management option | ||
| + | |||
| + | SQL> shut immediate; | ||
| + | ASM diskgroups dismounted | ||
| + | ASM instance shutdown | ||
| + | SQL> exit; | ||
| + | Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production | ||
| + | With the Automatic Storage Management option | ||
| + | </ | ||
| + | * Now check the status of cluster resources then bring down the all cluster resources. | ||
| + | < | ||
| + | [grid@oracle ~]$ crsctl stat res -t | ||
| + | -------------------------------------------------------------------------------- | ||
| + | Name | ||
| + | -------------------------------------------------------------------------------- | ||
| + | Local Resources | ||
| + | -------------------------------------------------------------------------------- | ||
| + | ora.CRS.dg | ||
| + | | ||
| + | ora.DATA.dg | ||
| + | | ||
| + | ora.FRA.dg | ||
| + | | ||
| + | ora.LISTENER.lsnr | ||
| + | | ||
| + | ora.ORA_LISTENER.lsnr | ||
| + | | ||
| + | ora.asm | ||
| + | | ||
| + | ora.ons | ||
| + | | ||
| + | -------------------------------------------------------------------------------- | ||
| + | Cluster Resources | ||
| + | -------------------------------------------------------------------------------- | ||
| + | ora.cssd | ||
| + | 1 ONLINE | ||
| + | ora.diskmon | ||
| + | 1 OFFLINE OFFLINE | ||
| + | ora.evmd | ||
| + | 1 ONLINE | ||
| + | ora.orcl.db | ||
| + | 1 OFFLINE OFFLINE | ||
| + | | ||
| + | ora.orcl1.db | ||
| + | 1 OFFLINE OFFLINE | ||
| + | | ||
| + | -------------------------------------------------------------------------------- | ||
| + | [grid@oracle ~]$ crsctl stop has | ||
| + | CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on ' | ||
| + | CRS-2673: Attempting to stop ' | ||
| + | CRS-2673: Attempting to stop ' | ||
| + | CRS-2677: Stop of ' | ||
| + | CRS-2673: Attempting to stop ' | ||
| + | CRS-2677: Stop of ' | ||
| + | CRS-2677: Stop of ' | ||
| + | CRS-2793: Shutdown of Oracle High Availability Services-managed resources on ' | ||
| + | CRS-4133: Oracle High Availability Services has been stopped. | ||
| + | </ | ||
| + | ==== Useful ASM commands ==== | ||
| + | * [[https:// | ||
| + | ==== Migrate From Database File system to ASM ==== | ||
| + | * [[https:// | ||
| + | ==== See what disk groups exist ==== | ||
| + | From Sql*Plus | ||
| + | < | ||
| + | select group_number | ||
| + | , name | ||
| + | from | ||
| + | </ | ||
| + | ==== Check space available in disk groups ==== | ||
| + | < | ||
| + | select name | ||
| + | , state | ||
| + | , type | ||
| + | , round((total_mb/ | ||
| + | , round(((total_mb-free_mb)/ | ||
| + | , round((((total_mb-free_mb)/ | ||
| + | from | ||
| + | order by used_pct | ||
| + | / | ||
| + | </ | ||
| + | < | ||
| + | Disk Group Sector | ||
| + | Name Size Size Unit size State | ||
| + | -------------------- ------- ------- ------------ ----------- ------ --------------- -------------- --------- | ||
| + | DATA | ||
| + | FRA 512 | ||
| + | REDO | ||
| + | | ||
| + | Grand Total: | ||
| + | </ | ||
| + | ==== Create a new disk group ==== | ||
| + | === List partitions that can be used for an ASM disk === | ||
| + | Assumes Solaris, make allowances! | ||
| + | < | ||
| + | fdisk -l|grep '/ | ||
| + | </ | ||
| + | Compare the first list (of used disks) with the second list (of unassiged disks) | ||
| + | |||
| + | On AIX, maybe | ||
| + | < | ||
| + | lsvg -o|lsvg -il | ||
| + | </ | ||
| + | Pick an unused disk and feed it to fdisk | ||
| + | < | ||
| + | fdisk /dev/sde | ||
| + | </ | ||
| + | Recheck disk now appears in the upper list | ||
| + | < | ||
| + | fdisk -l|grep '/ | ||
| + | </ | ||
| + | List current diskgroups | ||
| + | < | ||
| + | oracleasm listdisks | ||
| + | </ | ||
| + | === Create an ASM disk from a device === | ||
| + | < | ||
| + | oracleasm createdisk ASMDATA1_2 /dev/sde1 | ||
| + | </ | ||
| + | Recheck it appears in the list of ASM disks | ||
| + | < | ||
| + | oracleasm listdisks | ||
| + | </ | ||
| + | === Add new ASM disk to a diskgroup === | ||
| + | < | ||
| + | alter diskgroup asmdata1 add disk '/ | ||
| + | </ | ||
| + | ==== Add a disk to an existing disk group ==== | ||
| + | See all previous steps for creating a new disk group and replace the last step (alter diskgroup) with | ||
| + | < | ||
| + | create diskgroup asmfra external redundancy disk '/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== See how the disk groups are linked to their paths ==== | ||
| + | < | ||
| + | set lines 2000 | ||
| + | col label for a20 | ||
| + | col path for a20 | ||
| + | select mount_status | ||
| + | , header_status | ||
| + | , mode_status | ||
| + | , state | ||
| + | , total_mb | ||
| + | , free_mb | ||
| + | , name | ||
| + | , path | ||
| + | , label | ||
| + | from | ||
| + | </ | ||
| gives... | gives... | ||
| - | < | + | < |
| - | =====Add disk to a disk group===== | + | MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB |
| - | < | + | ------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------- ---------- |
| + | CLOSED | ||
| + | CLOSED | ||
| + | CLOSED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | |||
| + | 10 rows selected. | ||
| + | |||
| + | </ | ||
| + | or, on AIX... | ||
| + | < | ||
| + | MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB | ||
| + | ------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------- -------------------- | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Add disk to a disk group ==== | ||
| + | < | ||
| + | alter diskgroup data add disk ' | ||
| + | alter diskgroup fra add disk ' | ||
| + | alter diskgroup fra add disk ' | ||
| + | </ | ||
| Now the same disk query as above gives an updated view | Now the same disk query as above gives an updated view | ||
| - | < | + | < |
| + | MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB | ||
| + | ------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------- ---------- | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| + | CACHED | ||
| - | =====Recheck space available in disk groups using query below===== | + | 10 rows selected. |
| - | < | + | |
| - | =====Restart ASM===== | + | </ |
| + | |||
| + | ==== Recheck space available in disk groups using query below ==== | ||
| + | < | ||
| + | Disk Group Sector | ||
| + | Name Size Size Unit size State | ||
| + | -------------------- ------- ------- ------------ ----------- ------ --------------- -------------- --------- | ||
| + | DATA | ||
| + | FRA 512 | ||
| + | REDO | ||
| + | | ||
| + | Grand Total: | ||
| + | </ | ||
| + | ==== Restart ASM ==== | ||
| cat / | cat / | ||
| - | < | + | < |
| + | / | ||
| + | / | ||
| + | / | ||
| + | ps -ef | grep -v grep | grep -q smon_+ASM | ||
| + | if [[ $? -ne 0 ]] | ||
| + | then | ||
| + | echo 'asm instance did not start in 1st attempt, sleeping for 30 secs and retrying' | ||
| + | sleep 30 | ||
| + | / | ||
| + | fi | ||
| + | / | ||
| + | </ | ||
| - | =====Where are the real disk group devices?===== | + | ==== Where are the real disk group devices? ==== |
| - | < | + | < |
| + | - !/bin/ksh | ||
| + | for i in `/ | ||
| + | do | ||
| + | v_asmdisk=`/ | ||
| + | v_minor=`/ | ||
| + | v_major=`/ | ||
| + | v_device=`ls -la /dev | grep $v_minor | grep $v_major | awk ' | ||
| + | echo "ASM disk $v_asmdisk based on / | ||
| + | done | ||
| + | </ | ||
| or check in | or check in | ||
| - | < | + | < |
| + | ls -al / | ||
| + | </ | ||
| The major and minor numbers should match up. | The major and minor numbers should match up. | ||
| - | =====Check free space in ASM diskgroups===== | + | ==== Check free space in ASM diskgroups ==== |
| cat / | cat / | ||
| - | < | + | < |
| + | #!/bin/sh | ||
| + | ORAENV_ASK=NO | ||
| + | export ORACLE_SID=+ASM | ||
| + | . oraenv | ||
| + | $ORACLE_HOME/ | ||
| + | column path format a40 | ||
| + | column name format a35 | ||
| + | set linesize 200 | ||
| + | select name, total_mb, | ||
| + | quit | ||
| + | EOF | ||
| + | </ | ||
| gives | gives | ||
| - | < | + | < |
| + | NAME TOTAL_MB | ||
| + | ----------------------------------- ---------- ---------- | ||
| + | RECO | ||
| + | REDO 763120 | ||
| + | DATA 14745600 | ||
| + | </ | ||
| or | or | ||
| - | < | + | < |
| - | ======Scripts====== | + | set linesize 145 |
| - | =====asm_capacity.sql===== | + | set pagesize 9999 |
| + | set verify off | ||
| + | |||
| + | column group_name format a20 head 'Disk Group|Name' | ||
| + | column sector_size format 99,999 head ' | ||
| + | column block_size format 99,999 head ' | ||
| + | column allocation_unit_size format 999,999,999 head ' | ||
| + | column state format a11 head ' | ||
| + | column type format a6 head ' | ||
| + | column total_mb format 999,999,999 head 'Total size (Mb)' | ||
| + | column used_mb format 999,999,999 head 'Used size (Mb)' | ||
| + | column pct_used format 999.99 head 'Pct. used' | ||
| + | |||
| + | break on report on disk_group_name skip 1 | ||
| + | compute sum label "Grand Total: " of total_mb used_mb on report | ||
| + | |||
| + | select name | ||
| + | , sector_size | ||
| + | , block_size | ||
| + | , allocation_unit_size allocation_unit_size | ||
| + | , state state | ||
| + | , type | ||
| + | , total_mb | ||
| + | , (total_mb - free_mb) used_mb | ||
| + | , round ( (1 -(free_mb / total_mb)) * 100, 2) pct_used | ||
| + | from | ||
| + | order by name; | ||
| + | </ | ||
| + | ===== Scripts ===== | ||
| + | ==== asm_capacity.sql ==== | ||
| Check resistance of an ASM cluster against a disk / cell failure | Check resistance of an ASM cluster against a disk / cell failure | ||
| - | < | + | < |
| - | =====asmdisks.ksh===== | + | SPOOL asm_disk_capacity.output |
| - | < | + | |
| - | =====asmdu.ksh===== | + | SET SERVEROUTPUT ON |
| - | < | + | SET LINES 155 |
| - | =====asmfiles.ksh===== | + | SET PAGES 0 |
| - | < | + | SET TRIMSPOOL ON |
| - | =====asmlog.pl===== | + | |
| - | < | + | DECLARE |
| - | =====crsstat.pl===== | + | |
| - | < | + | |
| - | =====csslog.pl===== | + | |
| - | < | + | |
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | |||
| + | BEGIN | ||
| + | |||
| + | | ||
| + | |||
| + | IF v_inst_name | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | GOTO the_end; | ||
| + | END IF; | ||
| + | |||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | | ||
| + | | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | | ||
| + | |||
| + | IF (v_db_version = ' | ||
| + | v_req_mirror_free_adj_factor := 1.10; | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | | ||
| + | v_req_mirror_free_adj_factor := 1.5; | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | END IF; | ||
| + | |||
| + | | ||
| + | -- Set up headings | ||
| + | | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT_Line(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | | ||
| + | |||
| + | FOR dg IN (SELECT name, type, group_number, | ||
| + | |||
| + | v_enuf_free := FALSE; | ||
| + | |||
| + | | ||
| + | |||
| + | -- Find largest amount of space allocated to a cell | ||
| + | SELECT sum(disk_cnt), | ||
| + | INTO v_num_disks, | ||
| + | FROM (SELECT count(1) disk_cnt, max(total_mb) max_total_mb, | ||
| + | FROM v$asm_disk | ||
| + | WHERE group_number = dg.group_number | ||
| + | GROUP BY failgroup); | ||
| + | |||
| + | -- Eighth Rack | ||
| + | IF dg.type = ' | ||
| + | |||
| + | -- Eighth Rack | ||
| + | IF (v_num_disks < 36) THEN | ||
| + | -- Use eqn: y = 1.21344 x+ 17429.8 | ||
| + | v_required_free_mb := 1.21344 * v_max_total_mb + 17429.8; | ||
| + | IF dg.free_mb | ||
| + | -- Quarter Rack | ||
| + | ELSIF (v_num_disks >= 36 AND v_num_disks < 84) THEN | ||
| + | -- Use eqn: y = 1.07687 x+ 19699.3 | ||
| + | -- Revised 2/21/14 for 11.2.0.4 to use eqn: y=0.803199x + 156867, more space but safer | ||
| + | v_required_free_mb := 0.803199 * v_max_total_mb + 156867; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | -- Half Rack | ||
| + | ELSIF (v_num_disks >= 84 AND v_num_disks < 168) THEN | ||
| + | -- Use eqn: y = 1.02475 x+53731.3 | ||
| + | v_required_free_mb := 1.02475 * v_max_total_mb + 53731.3; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | -- Full rack is most conservative, | ||
| + | | ||
| + | -- Use eqn: y = 1.33333 x+83220. | ||
| + | v_required_free_mb := 1.33333 * v_max_total_mb + 83220; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | |||
| + | END IF; | ||
| + | |||
| + | -- DISK usable file MB | ||
| + | | ||
| + | | ||
| + | |||
| + | -- CELL usable file MB | ||
| + | | ||
| + | | ||
| + | |||
| + | ELSE | ||
| + | -- HIGH redundancy | ||
| + | |||
| + | -- Eighth Rack | ||
| + | IF (v_num_disks <= 18) THEN | ||
| + | -- Use eqn: y = 4x + 0 | ||
| + | -- Updated for 11.2.0.4 to higher value: | ||
| + | v_required_free_mb := 3.84213 * v_max_total_mb + 84466.4; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | -- Quarter Rack | ||
| + | ELSIF (v_num_disks > 18 AND v_num_disks <= 36) THEN | ||
| + | -- Use eqn: y = 3.87356 x+417692. | ||
| + | v_required_free_mb := 3.87356 * v_max_total_mb + 417692; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | -- Half Rack | ||
| + | ELSIF (v_num_disks > 36 AND v_num_disks <= 84) THEN | ||
| + | -- Use eqn: y = 2.02222 x+56441.6 | ||
| + | v_required_free_mb := 2.02222 * v_max_total_mb + 56441.6; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | -- Full rack is most conservative, | ||
| + | | ||
| + | -- Use eqn: y = 2.14077 x+54276.4 | ||
| + | v_required_free_mb := 2.14077 * v_max_total_mb + 54276.4; | ||
| + | IF dg.free_mb > v_required_free_mb THEN v_enuf_free := TRUE; END IF; | ||
| + | |||
| + | END IF; | ||
| + | |||
| + | -- DISK usable file MB | ||
| + | | ||
| + | | ||
| + | |||
| + | -- CELL usable file MB | ||
| + | | ||
| + | |||
| + | END IF; | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | |||
| + | IF v_enuf_free THEN | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | END IF; | ||
| + | |||
| + | IF dg.type = ' | ||
| + | -- Calc Free Space for Rebalance Due to Cell Failure | ||
| + | IF v_req_mirror_free_adj < dg.free_mb THEN | ||
| + | | ||
| + | ELSE | ||
| + | DBMS_OUTPUT.PUT(' | ||
| + | v_cfc_fail_msg := ' | ||
| + | END IF; | ||
| + | | ||
| + | -- Calc Free Space for Rebalance Due to Single Cell Failure | ||
| + | IF v_one_cell_req_mir_free_mb < dg.free_mb THEN | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | | ||
| + | END IF; | ||
| + | |||
| + | END IF; | ||
| + | |||
| + | -- Calc Disk Utilization Percentage | ||
| + | IF dg.total_mb > 0 THEN | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | END IF; | ||
| + | |||
| + | END LOOP; | ||
| + | |||
| + | | ||
| + | << | ||
| + | |||
| + | IF v_cfc_fail_msg is not null THEN | ||
| + | DBMS_OUTPUT.PUT_LINE(' | ||
| + | DBMS_OUTPUT.PUT_LINE(v_cfc_fail_msg); | ||
| + | END IF; | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | END; | ||
| + | / | ||
| + | |||
| + | WHENEVER SQLERROR EXIT FAILURE; | ||
| + | |||
| + | SPOOL OFF | ||
| + | </ | ||
| + | ==== asmdisks.ksh ==== | ||
| + | < | ||
| + | # | ||
| + | export ORACLE_SID=+ASM`$GRID_HOME/ | ||
| + | export ORACLE_HOME=`grep " | ||
| + | export PATH=$ORACLE_HOME/ | ||
| + | sqlplus -s "/ as sysasm" | ||
| + | |||
| + | prompt | ||
| + | prompt | ||
| + | prompt =================== OVERVIEW OF ASM DISKGROUPS ================================== | ||
| + | set lines 150 | ||
| + | set pages 50000 | ||
| + | Col name format a15 | ||
| + | Col nr_disks format 99 | ||
| + | Col pctused format 9999 heading " | ||
| + | Col used format 9999990 heading " | ||
| + | select name, state, total_mb, (total_mb-free_mb) as used, | ||
| + | case when total_mb > 0 then trunc(100*(total_mb-free_mb)/total_mb) else null end as pctused, | ||
| + | | ||
| + | where group_number = g.group_number) as nr_disks, | ||
| + | | ||
| + | from v\$asm_diskgroup g | ||
| + | ; | ||
| + | |||
| + | prompt | ||
| + | prompt ==================== OVERVIEW OF ASM DISKS ====================================== | ||
| + | set feed off | ||
| + | set pages 50000 | ||
| + | Set lines 150 | ||
| + | Col path format a30 | ||
| + | Col label format a10 | ||
| + | Col failgroup format a11 | ||
| + | Col diskgroup format a10 | ||
| + | Col state format a10 | ||
| + | Col total_mb format 9999990 heading " | ||
| + | Col used format 9999990 heading " | ||
| + | Col pctused format 9999 Heading " | ||
| + | Col name format a15 heading " | ||
| + | Col header_status format a15 heading " | ||
| + | break on header_status skip 1 dup on diskgroup skip 0 nodup | ||
| + | select g.name as diskgroup, d.path, d.total_mb, (d.total_mb-d.free_mb) as used, | ||
| + | case when d.total_mb | ||
| + | substr(d.mode_status, | ||
| + | | ||
| + | from v\$asm_disk d, (select * from v\$asm_diskgroup where group_number <> 0) g | ||
| + | Where d.group_number | ||
| + | Order by g.name, d.path; | ||
| + | |||
| + | prompt | ||
| + | prompt | ||
| + | prompt =================== OVERVIEW OF ASM OPERATIONS ================================== | ||
| + | Col name format a15 | ||
| + | select g.name, o.operation, | ||
| + | from v\$asm_diskgroup g, gv\$asm_operation o | ||
| + | where o.group_number = g.group_number | ||
| + | ; | ||
| + | |||
| + | |||
| + | prompt | ||
| + | exit; | ||
| + | EOF | ||
| + | </ | ||
| + | ==== asmdu.ksh ==== | ||
| + | < | ||
| + | # | ||
| + | export ORACLE_SID=+ASM`$GRID_HOME/ | ||
| + | export ORACLE_HOME=`grep " | ||
| + | export PATH=$ORACLE_HOME/ | ||
| + | |||
| + | - If Argument, then set bind variable ( filtering on file_path ) | ||
| + | if [[ -z $1 ]] | ||
| + | then | ||
| + | filter="" | ||
| + | else | ||
| + | filter=$1 | ||
| + | filter=`echo $filter|tr [[a-z]] [[A-Z]]` | ||
| + | fi | ||
| + | |||
| + | sqlplus -s "/ as sysasm" | ||
| + | |||
| + | Set pages 100 | ||
| + | set lines 100 | ||
| + | Col diskgroup format a10 | ||
| + | Col dbuniquename format a32 | ||
| + | Col ftype format a16 | ||
| + | break on diskgroup on dbuniquename on ftype | ||
| + | SELECT diskgroup, dbuniquename, | ||
| + | FROM ( | ||
| + | SELECT g.name diskgroup | ||
| + | , SUBSTR(a.fpath, | ||
| + | , SUBSTR(a.fpath, | ||
| + | , f.bytes as bytes | ||
| + | FROM v\$asm_file f | ||
| + | , ( | ||
| + | SELECT sys_connect_by_path(name, | ||
| + | FROM v\$asm_alias | ||
| + | START WITH (mod(parent_index, | ||
| + | CONNECT BY PRIOR reference_index = parent_index | ||
| + | ) a | ||
| + | , v\$asm_diskgroup g | ||
| + | WHERE f.file_number = a.file_number | ||
| + | AND f.group_number = a.group_number | ||
| + | AND g.group_number = a.group_number | ||
| + | ) | ||
| + | where dbuniquename like ' | ||
| + | GROUP BY diskgroup, dbuniquename ,ftype | ||
| + | / | ||
| + | |||
| + | exit; | ||
| + | EOF | ||
| + | </ | ||
| + | ==== asmfiles.ksh ==== | ||
| + | < | ||
| + | # | ||
| + | export ORACLE_SID=+ASM`$GRID_HOME/ | ||
| + | export ORACLE_HOME=`grep " | ||
| + | export PATH=$ORACLE_HOME/ | ||
| + | |||
| + | - If Argument, then set bind variable ( filtering on file_path ) | ||
| + | if [[ -z $1 ]] | ||
| + | then | ||
| + | filter="" | ||
| + | else | ||
| + | filter=$1 | ||
| + | filter=`echo $filter|tr [[a-z]] [[A-Z]]` | ||
| + | fi | ||
| + | |||
| + | sqlplus -s "/ as sysasm" | ||
| + | |||
| + | Set pages 100 | ||
| + | --Col full_alias_path format a70 | ||
| + | --SELECT concat(' | ||
| + | -- FROM (SELECT g.name gname, a.parent_index pindex, a.name aname | ||
| + | -- , | ||
| + | -- FROM v\$asm_alias a, v\$asm_diskgroup g | ||
| + | -- WHERE a.group_number = g.group_number) | ||
| + | -- START WITH (mod(pindex, | ||
| + | -- CONNECT BY PRIOR rindex = pindex; | ||
| + | |||
| + | |||
| + | set feed off | ||
| + | col max_width new_value maxwidth noprint | ||
| + | select to_char(max(length(file_path))) as max_width from | ||
| + | | ||
| + | from v\$asm_alias a, v\$asm_diskgroup g | ||
| + | where a.group_number = g.group_number | ||
| + | START WITH (mod(parent_index, | ||
| + | CONNECT BY PRIOR reference_index = parent_index) | ||
| + | ; | ||
| + | |||
| + | |||
| + | alter session set nls_numeric_characters = ', | ||
| + | |||
| + | set lines 150 | ||
| + | col disk_group format a11 heading "Disk Group" | ||
| + | col file_path format a& | ||
| + | col bytes heading " | ||
| + | col created format a20 | ||
| + | break on report on disk_group skip 1 | ||
| + | compute sum label "Group Total" of bytes on disk_group | ||
| + | compute sum label " | ||
| + | |||
| + | SELECT | ||
| + | | ||
| + | case when alias_path is not null then ' >>>' | ||
| + | -- case when bytes < 1024 then lpad(to_char(bytes), | ||
| + | -- when bytes < 1024*1024 | ||
| + | -- when bytes < 1024*1024*1024 then lpad(round(bytes/ | ||
| + | -- else lpad(round(bytes/ | ||
| + | -- | ||
| + | | ||
| + | | ||
| + | | ||
| + | FROM (SELECT a.group_number, | ||
| + | FROM v\$asm_alias a, v\$asm_file f | ||
| + | WHERE a.group_number | ||
| + | | ||
| + | | ||
| + | ) x1, | ||
| + | | ||
| + | | ||
| + | | ||
| + | from v\$asm_alias a, v\$asm_diskgroup g | ||
| + | where a.group_number = g.group_number | ||
| + | START WITH (mod(parent_index, | ||
| + | CONNECT BY PRIOR reference_index = parent_index) | ||
| + | where system_created = ' | ||
| + | ) x2, | ||
| + | | ||
| + | | ||
| + | | ||
| + | from v\$asm_alias a, v\$asm_diskgroup g | ||
| + | where a.group_number = g.group_number | ||
| + | START WITH (mod(parent_index, | ||
| + | CONNECT BY PRIOR reference_index = parent_index) | ||
| + | where system_created = ' | ||
| + | ) x3 | ||
| + | where x1.group_number = x2.group_number | ||
| + | | ||
| + | | ||
| + | | ||
| + | AND file_path like ' | ||
| + | |||
| + | exit; | ||
| + | EOF | ||
| + | </ | ||
| + | ==== asmlog.pl ==== | ||
| + | < | ||
| + | # | ||
| + | - | ||
| + | use Env; | ||
| + | use Time:: | ||
| + | |||
| + | if ( !$ENV{" | ||
| + | print " | ||
| + | "; | ||
| + | exit 1; | ||
| + | } | ||
| + | |||
| + | use vars qw/ %opt /; | ||
| + | use Getopt:: | ||
| + | |||
| + | my $opt_string = ' | ||
| + | getopts( " | ||
| + | |||
| + | $retention=$ARGV[[0]]; | ||
| + | $retention = 3600 if !defined $retention; | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | $starttime=timegm(localtime()); | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print "\ | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | $printing=0; | ||
| + | |||
| + | $Tmp=`$GRID_HOME/ | ||
| + | ($NodeName, | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | $temp=`$GRID_HOME/ | ||
| + | $temp=~/ | ||
| + | $OraHome=$1; | ||
| + | $Instance=`cat / | ||
| + | if (! $Instance ) | ||
| + | { | ||
| + | $Instance=`cat / | ||
| + | } | ||
| + | chomp($Instance); | ||
| + | print "ASM Instance: $Instance\ | ||
| + | "; | ||
| + | print "ASM Home: $OraHome\ | ||
| + | "; | ||
| + | $Bdump=`ORACLE_HOME=$GRID_HOME ORACLE_SID=$Instance sqlplus -s "/ as sysdba" | ||
| + | set head off | ||
| + | set feed off | ||
| + | set pages 0 | ||
| + | select value from v\\\\\\$parameter where name = ' | ||
| + | exit | ||
| + | EOF | ||
| + | `; | ||
| + | chop($Bdump); | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | if ($opt{f}) { | ||
| + | | ||
| + | } else { | ||
| + | | ||
| + | } | ||
| + | |||
| + | while(< | ||
| + | | ||
| + | # | ||
| + | "; | ||
| + | & | ||
| + | } | ||
| + | close ALRT; | ||
| + | |||
| + | print "\ | ||
| + | \ | ||
| + | "; | ||
| + | |||
| + | sub date2secs { | ||
| + | my $date = shift; | ||
| + | my @date =(0, | ||
| + | | ||
| + | - | ||
| + | - Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11, }}{$date[[4]]}; | ||
| + | - | ||
| + | - " | ||
| + | $date[[4]]=${{" | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | return timegm(@date); | ||
| + | } | ||
| + | |||
| + | - print & | ||
| + | "; | ||
| + | - print timegm(localtime())." | ||
| + | "; | ||
| + | |||
| + | sub printwrap { | ||
| + | my $line=join " ", | ||
| + | if (length($line) > 100) { | ||
| + | my $part1=substr($line, | ||
| + | my $part2=substr($line, | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | } else { | ||
| + | print " | ||
| + | "; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | sub pr { | ||
| + | # We need YYYY-MON-DD HH24: | ||
| + | my $line=$_; | ||
| + | if (/^(...) (...) +(\\d+) (\\d\\d: | ||
| + | $datetime=" | ||
| + | $lasttime=" | ||
| + | } elsif (/ | ||
| + | $datetime=$1; | ||
| + | $lasttime=" | ||
| + | } elsif (/ | ||
| + | $datetime=" | ||
| + | $lasttime=" | ||
| + | } else { | ||
| + | $datetime=""; | ||
| + | } | ||
| + | |||
| + | if ($datetime) { | ||
| + | $linetime=& | ||
| + | if ($linetime > $starttime-$retention) { | ||
| + | | ||
| + | } else { | ||
| + | } | ||
| + | } else { | ||
| + | if ($printing) { | ||
| + | printwrap " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | ==== crsstat.pl ==== | ||
| + | < | ||
| + | unless ($#ARGV < 1) { | ||
| + | & | ||
| + | } | ||
| + | |||
| + | - Usage | ||
| + | sub usage { | ||
| + | print << | ||
| + | crsstat {filter} | ||
| + | | ||
| + | ENDOFUSAGE | ||
| + | exit(0); | ||
| + | } | ||
| + | |||
| + | if (@ARGV) | ||
| + | { | ||
| + | $filter=' | ||
| + | } | ||
| + | |||
| + | @output=`crsctl status resource -t $filter`; | ||
| + | |||
| + | - -------------------------------------------------------------- | ||
| + | - Rapport Status | ||
| + | format STDOUT_TOP | ||
| + | | ||
| + | ---------------------------------------------------------------------------------------------- | ||
| + | . | ||
| + | |||
| + | format | ||
| + | | ||
| + | | ||
| + | . | ||
| + | |||
| + | write(); | ||
| + | foreach (@output) | ||
| + | { | ||
| + | chomp($_); | ||
| + | if ( / | ||
| + | { # resource line | ||
| + | $resource=$_; | ||
| + | } | ||
| + | elsif (/ | ||
| + | { | ||
| + | $target=$1; | ||
| + | $status=$2; | ||
| + | $server=$3; | ||
| + | |||
| + | write(); | ||
| + | } | ||
| + | elsif ( / | ||
| + | { # status line Cluster Resources | ||
| + | $target=$1; | ||
| + | $status=$2; | ||
| + | $server=$3; | ||
| + | $state_details=$4; | ||
| + | $state_details=~ s/ | ||
| + | |||
| + | write(); | ||
| + | $state_details=""; | ||
| + | } | ||
| + | elsif ( / | ||
| + | { # status line Local Resources | ||
| + | $target=$1; | ||
| + | $status=$2; | ||
| + | $server=$3; | ||
| + | $state_details=$4; | ||
| + | $state_details=~ s/ | ||
| + | |||
| + | write(); | ||
| + | $state_details=""; | ||
| + | } | ||
| + | elsif (/NAME/ || /----/) | ||
| + | { # Titles line | ||
| + | # skip | ||
| + | } | ||
| + | else | ||
| + | { # Header Lines | ||
| + | print $_ . "\ | ||
| + | "; | ||
| + | $resource=""; | ||
| + | $target=""; | ||
| + | $server=""; | ||
| + | $state_details=""; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ==== csslog.pl ==== | ||
| + | < | ||
| + | - !/ | ||
| + | - | ||
| + | use Env; | ||
| + | use Time:: | ||
| + | |||
| + | if ( !$ENV{" | ||
| + | print " | ||
| + | "; | ||
| + | exit 1; | ||
| + | } | ||
| + | |||
| + | use vars qw/ %opt /; | ||
| + | use Getopt:: | ||
| + | |||
| + | my $opt_string = ' | ||
| + | getopts( " | ||
| + | |||
| + | |||
| + | sub usage { | ||
| + | print " | ||
| + | "; | ||
| + | exit 0 | ||
| + | } | ||
| + | |||
| + | $retention=$ARGV[[0]]; | ||
| + | $retention = 3600 if !defined $retention; | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | $starttime=timegm(localtime()); | ||
| + | |||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | print "\ | ||
| + | "; | ||
| + | |||
| + | $Tmp=`$GRID_HOME/ | ||
| + | ($NodeName, | ||
| + | print " | ||
| + | "; | ||
| + | |||
| + | print " | ||
| + | "; | ||
| + | $printing=0; | ||
| + | $NrIgnored=0; | ||
| + | $Hostname=`hostname -s`; | ||
| + | chomp($Hostname); | ||
| + | if ( ! $NodeName ) | ||
| + | { | ||
| + | | ||
| + | } | ||
| + | $cssdfile=" | ||
| + | print " | ||
| + | "; | ||
| + | if ($opt{f}) { | ||
| + | | ||
| + | } else { | ||
| + | | ||
| + | } | ||
| + | while (< | ||
| + | | ||
| + | if (!/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | & | ||
| + | } else { | ||
| + | $NrIgnored++; | ||
| + | } | ||
| + | } | ||
| + | close CSS; | ||
| + | print " | ||
| + | "; | ||
| + | print "\ | ||
| + | \ | ||
| + | "; | ||
| + | |||
| + | - grep -v " | ||
| + | - grep -v " | ||
| + | - grep -v " | ||
| + | - grep -v "not active, rc 11" | \\ | ||
| + | - grep -v " | ||
| + | - grep -v " | ||
| + | - echo | ||
| + | - echo | ||
| + | |||
| + | sub date2secs { | ||
| + | my $date = shift; | ||
| + | my @date =(0, | ||
| + | | ||
| + | - | ||
| + | - Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11, }}{$date[[4]]}; | ||
| + | - | ||
| + | - " | ||
| + | $date[[4]]=${{" | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | return timegm(@date); | ||
| + | } | ||
| + | |||
| + | - print & | ||
| + | "; | ||
| + | - print timegm(localtime())." | ||
| + | "; | ||
| + | |||
| + | sub printwrap { | ||
| + | if (length($_) > 1000) { | ||
| + | $part1=substr($_, | ||
| + | $part2=substr($_, | ||
| + | print " | ||
| + | "; | ||
| + | print " | ||
| + | "; | ||
| + | } | ||
| + | else { | ||
| + | print "$_\ | ||
| + | "; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | sub pr { | ||
| + | my $line=$_; | ||
| + | if (/ | ||
| + | $datetime=$1; | ||
| + | } elsif (/ | ||
| + | $datetime=" | ||
| + | } else { | ||
| + | $datetime=""; | ||
| + | } | ||
| + | |||
| + | if ($datetime) { | ||
| + | $linetime=& | ||
| + | if ($linetime > $starttime-$retention) { | ||
| + | | ||
| + | "; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | printwrap " | ||
| + | "; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
asm.1544273360.txt.gz · Last modified: 2018/12/08 12:49 by 0.0.0.0
