вторник, 7 апреля 2009 г.

VxVM Striped Mirrors

Striped Mirrors

vxassist -g datadg make db001_v 10g layout=stripe,mirror stwidth=256 ncol=3 A1D0 A1D1 A1D3 A1D4 A1D5 A1D6
mkfs -F vxfs /dev/vx/rdsk/datadg/db001_v
mount -F vxfs /dev/vx/dsk/datadg/db001_v /var/temp

A simple concat
vxassist -g datadg make 10.1.0.3_v 5g layout=mirror A1L1 A1R1
-------------------------------------------------------------

If vxassist fails to make a mirror we can use vxmake
USe vxprint to find unused space as below

sd A1D1-O4 - A1D1 13335804 4445268 - c1t8d0 ENA
sd A1D1-O3 - A1D1 17781072 4445268 - c1t8d0 ENA
sd A1D1-I4 - A1D1 53343216 4445268 - c1t8d0 ENA

tncbu01:root# vxmake -g datadg plex spare layout=stripe stwidth=64 sd=A1D1-O4,A1D1-O3,A1D1-I4,A1D1-I5,A1D1-I6,A1D2-04,A1D2-I4,A1D2-I5,A1D2-I6,A1D3-O3,A1D3-I3,A1D3-I4,A1D3-I5,A1D3-I6

vxmake -g datadg -U fsgen vol spare_v plex=spare

vxmake -g datadg plex spare2 layout=stripe stwidth=64 sd=A1D4-O5,A1D4-O4,A1D4-O3,A1D4-I4,A1D4-I5,A1D4-I6,A1D5-O5,A1D5-O4,A1D5-O3,A1D5-I4,A1D5-I5,A1D5-I6,A1D6-O3,A1D6-I3,A1D6-I4

vxplex att spare_v spare2

vxvol -g datadg start spare_v

newfs /dev/vx/rdsk/datadg/spare_v

vxvol -g datadg resync spare_v

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

To manually configure each stage
disk offset (for 1st this is 0 then number in active column + number in next
column (length) for last vol)

1048640 = 1 gig

vxdg -g rootdg free
DISK DEVICE TAG OFFSET LENGTH FLAGS
rootdisk c1t0d0s2 c1t0d0 16386407 54737883 -
rootmirror c1t1d0s2 c1t1d0 12289806 58828707 -

vxmake -g rootdg sd root-db001 disk=rootdisk offset=16386407 len=4194560
vxmake -g rootdg sd root-db001a disk=rootmirror offset=16386407 len=4194560
vxmake -g rootdg sd root-db002 disk=rootdisk offset=20580967 len=4194560
vxmake -g rootdg sd root-db002a disk=rootmirror offset=20580967 len=4vxass194560
vxmake -g rootdg plex db001 layout=stripe stwidth=64 sd=root-db001,root-db001a
vxmake -g rootdg plex db002 layout=stripe stwidth=64 sd=root-db002,root-db002a
vxmake -g rootdg -o largefiles -Ufsgen vol db001_v plex=db001
vxmake -g rootdg -o largefiles -Ufsgen vol db002_v plex=db002
vxvol -g rootdg start db001_v
vxvol -g rootdg start db002_v
mkfs -F vxfs /dev/vx/rdsk/rootdg/db001_v
mkfs -F vxfs /dev/vx/rdsk/rootdg/db002_v
mkdir /db001 /db002
mount -F vxfs /dev/vx/dsk/rootdg/db001_v /db001
mount -F vxfs /dev/vx/dsk/rootdg/db002_v /db002
/usr/lib/fs/vxfs/fsadm -F vxfs -o largefiles /db001
/usr/lib/fs/vxfs/fsadm -F vxfs -o largefiles /db002
add entries to vfstab
/dev/vx/dsk/rootdg/db001_v /dev/vx/rdsk/rootdg/db001_v /db001 vxfs 3 yes largefiles
/dev/vx/dsk/rootdg/db002_v /dev/vx/rdsk/rootdg/db002_v /db002 vxfs 3 yes largefiles

Solaris Installing OpenSSH

Installing OpenSSH
In this example, I install OpenSSH 4.6p1 and prerequisites from Sunfreeware packages on a Solaris 8 Sparc system.

Sunfreeware Packages:

openssh-4.6p1-sol8-sparc-local.gz
libgcc-3.4.6-sol8-sparc-local.gz
openssl-0.9.8e-sol8-sparc-local.gz

# gzip -d openssh-4.6p1-sol8-sparc-local.gz
# gzip -d libgcc-3.4.6-sol8-sparc-local.gz
# gzip -d openssl-0.9.8e-sol8-sparc-local.gz

# pkgadd -d ./openssh-4.6p1-sol8-sparc-local
# pkgadd -d ./libgcc-3.4.6-sol8-sparc-local
# pkgadd -d ./openssl-0.9.8e-sol8-sparc-local

After installing the packages, run the following script to configure and run OpenSSH:
#!/bin/sh

# Create sshd startup/shutdown script
cat << 'SSHD' > /etc/init.d/sshd
#!/bin/sh

case "$1" in
'start')
/usr/local/sbin/sshd
;;
'stop')
/usr/bin/kill `/usr/bin/head -1 /var/run/sshd.pid`
;;
'reload')
/usr/bin/kill -HUP `/usr/bin/head -1 /var/run/sshd.pid`
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0
SSHD
chown root:root /etc/init.d/sshd
chmod 555 /etc/init.d/sshd
ln -s /etc/init.d/sshd /etc/rc2.d/S98sshd

# Create ssh keys
/usr/local/bin/ssh-keygen -t rsa1 -f /usr/local/etc/ssh_host_key -N ""
/usr/local/bin/ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N ""
/usr/local/bin/ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ""

# Use only ssh protocol 2
sed -e 's/#Protocol 2,1/Protocol 2/' /usr/local/etc/sshd_config > /usr/local/etc/sshd_config_new
mv /usr/local/etc/sshd_config_new /usr/local/etc/sshd_config

# Create privilege separation user and environment
mkdir -m 755 /var/empty
chown root:root /var/empty
groupadd sshd
useradd -g sshd -c "OpenSSH privilege separation user" -d /var/empty -s /bin/false sshd

# start sshd
/etc/init.d/sshd start
Old notes

The following instructions show how to install OpenSSH from source and from package for Solaris. I recommend installing from source on Solaris systems, because if a vulnerability is discovered in OpenSSH, it is faster to upgrade from source than wait for package maintainers to release new packages.

Download the "portable" (i.e. you are not running OpenBSD) version of OpenSSH here:
ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
Installing OpenSSH from source
1. Download and install the openssl and zlib prerequisites from source or from package.

2. Download the "portable" version of OpenSSH.

3. Uncompress the OpenSSH tarball.

4. Run ./configure
Note: to build static OpenSSH binaries, run ./configure --with-ldflags=-static

If you receive the following error when running ./configure, you may have to install the libgcc package from Sunfreeware:
checking OpenSSL header version... not found
configure: error: OpenSSL version header not found.

Error in config.log:
configure:8694: ./conftest
ld.so.1: ./conftest: fatal: libgcc_s.so.1: open failed: No such file or directory
Killed

If you receive the following warning when running ./configure:

Random number source: ssh-rand-helper

WARNING: you are using the builtin random number collection
service. Please read WARNING.RNG and request that your OS
vendor includes kernel-based random number collection in
future versions of your OS.

You may want to install the ANDIrand package. This package installs a kernel module that emulates /dev/random and /dev/urandom on Solaris systems. A reboot is not required after installing this package to create the devices.
Alternatively, you may download the PRNGd package and compile OpenSSH with support for PRNGd (--with-prngd-port=xx or --with-prngd-socket=xx). In any case, OpenSSH's WARNING.RNG file appears to suggest using an alternate method of entropy generation rather than the built-in ssh-rand-helper.

If you see:

Random number source: OpenSSL internal ONLY

OpenSSH will use OpenSSL's random number source, which uses /dev/urandom. You are not using OpenSSH's built-in random number collection service, so you should not see the warning message.

5. Run make

6. Create the sshd privilege separation user and environment. View README.privsep from the OpenSSH source for more information.

# [ ! -d /var/empty ] && mkdir -m 755 /var/empty
# chown root:sys /var/empty
# groupadd sshd
# useradd -g sshd -c "OpenSSH privilege separation user" -d /var/empty -s /bin/false sshd

7. Run su root -c "make install"

8. Create an sshd startup/shutdown script.

# vi /etc/init.d/sshd

Add:
#!/bin/sh

case "$1" in
'start')
/usr/local/sbin/sshd
;;
'stop')
/usr/bin/kill `/usr/bin/head -1 /var/run/sshd.pid`
;;
'reload')
/usr/bin/kill -HUP `/usr/bin/head -1 /var/run/sshd.pid`
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0

# chown root:root /etc/init.d/sshd
# chmod 744 /etc/init.d/sshd
# ln -s /etc/init.d/sshd /etc/rc2.d/S98sshd
9. Start sshd.
# /etc/init.d/sshd start

Installing OpenSSH from package

I use the following steps to install OpenSSH from Solaris packages. Please read all scripts carefully along with the excellent Web pages "Installing OpenSSH Packages" and "Installing OpenSSH Packages for SPARC and Intel/Solaris 8."

OpenSSH requires /dev/random or a pseudo-random number generator like PRNGd to generate entropy.

* Solaris 9 provides /dev/random by default. The PRNGd package is not needed to generate entropy.
* If you are using Solaris 8, you may install Solaris patch 112438-01 (PRNG /kernel/drv/random patch) to create /dev/random and /dev/urandom. PRNGd is not needed if you use this patch. A reboot is required after installing this patch to create /dev/random and /dev/urandom. A reboot is not required if you install the Solaris 8 ANDIrand package (see below).
* If you are using earlier versions of Solaris, you may install the ANDIrand package. This package installs a kernel module to emulate /dev/random and /dev/urandom. PRNGd is not needed if you install this package. A reboot is not required after installing the ANDIrand package.
* If you use PRNGd with Solaris 8, the prngd executable is in /usr/local/sbin, not /usr/local/bin. Change /etc/init.d/prngd accordingly.

General instructions:

1. Download and install the openssh, PRNGd (if applicable), openssl, zlib, and libgcc packages from Sunfreeware. I prefer the Sunfreeware mirror ftp://mirrors.xmission.com/sunfreeware

2. Create prngd file (if applicable):

#!/bin/sh

case "$1" in
'start')
/usr/local/sbin/prngd /var/spool/prngd/pool
;;
'stop')
/usr/bin/kill `/usr/bin/ps -e -o pid,args | /usr/bin/grep [p]rngd | /usr/bin/awk '{print $1}'`
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0

3. Create sshd file:

#!/bin/sh

case "$1" in
'start')
/usr/local/sbin/sshd
;;
'stop')
/usr/bin/kill `/usr/bin/head -1 /var/run/sshd.pid`
;;
'reload')
/usr/bin/kill -HUP `/usr/bin/head -1 /var/run/sshd.pid`
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0

4. Create install.sh file.

If you are using PRNGd:

#!/bin/sh

# Create entropy
cat /var/log/* /var/adm/* > /usr/local/etc/prngd/prngd-seed
mkdir /var/spool/prngd
/usr/local/sbin/prngd /var/spool/prngd/pool

# Run prngd at startup
cp prngd /etc/init.d
chown root:root /etc/init.d/prngd
chmod 555 /etc/init.d/prngd
ln -s /etc/init.d/prngd /etc/rc2.d/S98prngd

# Create ssh keys
/usr/local/bin/ssh-keygen -t rsa1 -f /usr/local/etc/ssh_host_key -N ""
/usr/local/bin/ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N ""
/usr/local/bin/ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ""

# Run sshd at startup
cp sshd /etc/init.d
chown root:root /etc/init.d/sshd
chmod 555 /etc/init.d/sshd
ln -s /etc/init.d/sshd /etc/rc2.d/S98sshd

# Use only ssh protocol 2; version 1.33 and 1.5 of ssh protocol
# is not completely cryptographically safe (according to Nessus probe)
# Do not allow remote root logins via ssh
# Prevent /etc/motd from displaying twice when using ssh
# Allow X11 forwarding
sed -e 's/#Protocol 2,1/Protocol 2/' -e 's/PermitRootLogin yes/#PermitRootLogin no/' -e 's/#X11Forwarding no/X11Forwarding yes/' -e's/#PrintMotd yes/PrintMotd no/' /usr/local/etc/sshd_config > /usr/local/etc/sshd_config_new
mv /usr/local/etc/sshd_config_new /usr/local/etc/sshd_config

# Create privilege separation user and environment
mkdir -m 755 /var/empty
chown root:root /var/empty
groupadd sshd
useradd -g sshd -c "OpenSSH privilege separation user" -d /var/empty -s /bin/false sshd
# Start sshd
/etc/init.d/sshd start

If you are not using PRNGd:

#!/bin/sh

# Create ssh keys
/usr/local/bin/ssh-keygen -t rsa1 -f /usr/local/etc/ssh_host_key -N ""
/usr/local/bin/ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N ""
/usr/local/bin/ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ""

# Run sshd at startup
cp sshd /etc/init.d
chown root:root /etc/init.d/sshd
chmod 555 /etc/init.d/sshd
ln -s /etc/init.d/sshd /etc/rc2.d/S98sshd

# Use only ssh protocol 2; version 1.33 and 1.5 of ssh protocol
# is not completely cryptographically safe (according to Nessus probe)
# Do not allow remote root logins via ssh
# Prevent /etc/motd from displaying twice when using ssh
# Allow X11 forwarding
sed -e 's/#Protocol 2,1/Protocol 2/' \
-e 's/PermitRootLogin yes/#PermitRootLogin no/' \
-e 's/#X11Forwarding no/X11Forwarding yes/' \
-e 's/#PrintMotd yes/PrintMotd no/' \
/usr/local/etc/sshd_config > /usr/local/etc/sshd_config_new
mv /usr/local/etc/sshd_config_new /usr/local/etc/sshd_config

# Create privilege separation user and environment
mkdir -m 755 /var/empty
chown root:root /var/empty
groupadd sshd
useradd -g sshd -c "OpenSSH privilege separation user" -d /var/empty -s /bin/false sshd
# Start sshd
/etc/init.d/sshd start

5. Run install.sh as root.
# sh ./install.sh

Solaris Disk duplication

Disk duplication
It is easy to duplicate a disk with the same geometry (cylinders, heads, sectors) with the dd command. In the following example, I will duplicate boot disk c0t0d0 with c0t1d0 on a Solaris system. Of course, this is not the same as mirroring the boot disk.

The dd command's bit-for-bit copy includes the partition table and boot block, so duplicating the partition table with prtvtoc and making the disk bootable with installboot is not necessary.

# format < /dev/null
Searching for disks...done


AVAILABLE DISK SELECTIONS:
0. c0t0d0
/sbus@1f,0/SUNW,fas@e,8800000/sd@0,0
1. c0t1d0
/sbus@1f,0/SUNW,fas@e,8800000/sd@1,0
Specify disk (enter its number):

1. Make a bit-for-bit copy of the source disk to the destination disk with dd. Use a 1 megabyte blocksize instead of the 512 byte default to speed up the operation.
dd if=/dev/rdsk/c0t0d0s2 of=/dev/rdsk/c0t1d0s2 bs=1024k

2. Change the /etc/vfstab file on the duplicate boot disk to reflect the correct SCSI ID.

mkdir /tmp/mnt
mount /dev/dsk/c0t1d0s0 /tmp/mnt
vi /tmp/mnt/etc/vfstab

Change references of c0t0d0 to c0t1d0:

:%s/c0t0d0/c0t1d0/g
:wq!

umount /tmp/mnt

3. Test booting off the duplicate boot disk (assuming disk1 is the correct Open Boot Prompt device alias for c0t1d0s0).

reboot -- disk1

Solaris timezones

Solaris timezones
Which timezone am I using?
$ grep '^TZ' /etc/TIMEZONE

How do I change my timezone?
Modify the TZ= line in /etc/TIMEZONE to and reboot the system.

Which timezones are available?
$ ls /usr/share/lib/zoneinfo

Solaris zones

Solaris zones
In this example, I create, boot, and configure a sparse zone named osummdo001.

# zonecfg -z osummdo001
osummdo001: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:osummdo001> create

By default, the zone will not boot when the global zone (system) boots, so I change that behavior.

zonecfg:osummdo001> set autoboot=true

According to the System Administration Guide: Solaris Containers-Resource Management and Solaris Zones (November 2006), the zonepath should not be on ZFS.

zonecfg:osummdo001> set zonepath=/osummdo001/root

The ZFS dataset zfspool/osummdo001/oracle will be made available as /files0/oracle within the zone.

zonecfg:osummdo001> add fs
zonecfg:osummdo001:fs> set dir=/files0/oracle
zonecfg:osummdo001:fs> set special=/zfspool/osummdo001/oracle
zonecfg:osummdo001:fs> set type=lofs
zonecfg:osummdo001:fs> end

I add a network interface to the zone.

zonecfg:osummdo001> add net
zonecfg:osummdo001:net> set physical=dmfe0
zonecfg:osummdo001:net> set address=192.168.1.100
zonecfg:osummdo001:net> end

Next, I verify the zone's configuration, and install the zone.

# zoneadm -z osummdo001 verify

# zoneadm -z osummdo001 install
Preparing to install zone .
Creating list of files to copy from the global zone.
Copying <8726> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <297> packages on the zone.
Initialized <297> packages on zone.
Zone is initialized.
Installation of these packages generated errors:
Installation of <1> packages was skipped.
The file
contains a log of the zone installation.

I then boot the zone, and login on the zone's console to complete zone system identification.

# zoneadm -z osummdo001 boot
# zlogin -C osummdo001
Adding a file system to a zone
In this example, I add a ZFS file system named /oradata1 to the osummdo001 zone.

First, I create the ZFS file system in the global zone.

# zfs create zfspool/osummdo001/oradata1

Next, I add the file system to the zone's configuration.

# zonecfg -z osummdo001
zonecfg:osummdo001> add fs
zonecfg:osummdo001:fs> set dir=/oradata1
zonecfg:osummdo001:fs> set special=/zfspool/osummdo001/oradata1
zonecfg:osummdo001:fs> set type=lofs
zonecfg:osummdo001:fs> end
zonecfg:osummdo001> commit
zonecfg:osummdo001> end

The above commit is unnecessary, as the changes would have automatically been committed when typing end.

As of this writing, I do not know of any way to add the file system to a running zone. Rebooting the zone will cause the file system to be added to the zone.

# zoneadm -z osummdo001 reboot

JOBS


1. Создаём программы

2. Создаём расписания

3. Создаём задания для запуска программы в соответствии с расписанием


 

Программы создаются так:

 
BEGIN
  -- PL/SQL Block.
  DBMS_SCHEDULER.create_program (
    program_name   => 'test_plsql_block_prog',
    program_type   => 'PLSQL_BLOCK',
    program_action => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
    enabled        => TRUE,
    comments       => 'Program to gather SCOTT''s statistics using a PL/SQL block.');

  -- Shell Script.
  DBMS_SCHEDULER.create_program (
    program_name        => 'test_executable_prog',
    program_type        => 'EXECUTABLE',
    program_action      => '/u01/app/oracle/dba/gather_scott_stats.sh',
    number_of_arguments => 0,
    enabled             => TRUE,
    comments            => 'Program to gather SCOTT''s statistics us a shell script.');

 
 
  -- Stored Procedure with Arguments.
  DBMS_SCHEDULER.create_program (
    program_name        => 'test_stored_procedure_prog',
    program_type        => 'STORED_PROCEDURE',
    program_action      => 'DBMS_STATS.gather_schema_stats',
    number_of_arguments => 1,
    enabled             => FALSE,
    comments            => 'Program to gather SCOTT''s statistics using a stored procedure.');

  DBMS_SCHEDULER.define_program_argument (
    program_name      => 'test_stored_procedure_prog',
    argument_name     => 'ownname',
    argument_position => 1,
    argument_type     => 'VARCHAR2',
    default_value     => 'SCOTT');

  DBMS_SCHEDULER.enable (name => 'test_stored_procedure_prog');
END;
/

PL/SQL procedure successfully completed.

 
 
Просмотр программ:
 

SELECT owner, program_name, enabled FROM dba_scheduler_programs;

OWNER                          PROGRAM_NAME                   ENABL
------------------------------ ------------------------------ -----
SYS                            PURGE_LOG_PROG                 TRUE
SYS                            GATHER_STATS_PROG              TRUE
SYS                            TEST_PLSQL_BLOCK_PROG          TRUE
SYS                            TEST_EXECUTABLE_PROG           TRUE
SYS                            TEST_STORED_PROCEDURE_PROG     TRUE

5 rows selected.


Удалить программы: 
 
BEGIN
  DBMS_SCHEDULER.drop_program (program_name => 'test_plsql_block_prog');
  DBMS_SCHEDULER.drop_program (program_name => 'test_stored_procedure_prog');
  DBMS_SCHEDULER.drop_program (program_name => 'test_executable_prog');
END;
/

PL/SQL procedure successfully completed.

 
 
Просмотр программ:
 
SELECT owner, program_name, enabled FROM dba_scheduler_programs;

OWNER                          PROGRAM_NAME                   ENABL
------------------------------ ------------------------------ -----
SYS                            PURGE_LOG_PROG                 TRUE
SYS                            GATHER_STATS_PROG              TRUE 
 
 
 

Расписания создаются так:

BEGIN DBMS_SCHEDULER.create_schedule (
    schedule_name   => 'test_hourly_schedule',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=hourly; byminute=0',
    end_date        => NULL,
    comments        => 'Repeats hourly, on the hour, for ever.');
END;
/

PL/SQL procedure successfully completed.

 
 
Просмотр расписаний:
SELECT owner, schedule_name FROM dba_scheduler_schedules;

OWNER                          SCHEDULE_NAME
------------------------------ ------------------------------
SYS                            DAILY_PURGE_SCHEDULE
SYS                            TEST_HOURLY_SCHEDULE



Удалить расписание:
BEGIN
  DBMS_SCHEDULER.drop_schedule (schedule_name => 'TEST_HOURLY_SCHEDULE');
END;
/

PL/SQL procedure successfully completed.

 
 
Просмотр расписаний:
 
SELECT owner, schedule_name FROM dba_scheduler_schedules;

OWNER                          SCHEDULE_NAME
------------------------------ ------------------------------
SYS                            DAILY_PURGE_SCHEDULE

1 row selected. 
 
 
 

Задания (джобы) создаются так:


 
  
 BEGIN
  -- Job defined entirely by the CREATE JOB procedure.
  DBMS_SCHEDULER.create_job (
    job_name        => 'test_full_job_definition',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=hourly; byminute=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Job defined entirely by the CREATE JOB procedure.');

  -- Job defined by an existing program and schedule.
  DBMS_SCHEDULER.create_job (
    job_name      => 'test_prog_sched_job_definition',
    program_name  => 'test_plsql_block_prog',
    schedule_name => 'test_hourly_schedule',
    enabled       => TRUE,
    comments      => 'Job defined by an existing program and schedule.');

  -- Job defined by existing program and inline schedule.
  DBMS_SCHEDULER.create_job (
    job_name        => 'test_prog_job_definition',
    program_name    => 'test_plsql_block_prog',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=hourly; byminute=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Job defined by existing program and inline schedule.');

  -- Job defined by existing schedule and inline program.
  DBMS_SCHEDULER.create_job (
     job_name      => 'test_sched_job_definition',
     schedule_name => 'test_hourly_schedule',
     job_type      => 'PLSQL_BLOCK',
     job_action    => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
     enabled       => TRUE,
     comments      => 'Job defined by existing schedule and inline program.');
END;
/

PL/SQL procedure successfully completed.

 
 
Просмотр заданий (jobs):
 
SELECT owner, job_name, enabled FROM dba_scheduler_jobs;

OWNER                          JOB_NAME                       ENABL
------------------------------ ------------------------------ -----
SYS                            PURGE_LOG                      TRUE
SYS                            GATHER_STATS_JOB               TRUE
SYS                            TEST_FULL_JOB_DEFINITION       TRUE
SYS                            TEST_PROG_SCHED_JOB_DEFINITION TRUE
SYS                            TEST_PROG_JOB_DEFINITION       TRUE
SYS                            TEST_SCHED_JOB_DEFINITION      TRUE
 

 
 
Джобы обычно выполняются асинхронно под контролем job coordinator,
но их можно запускать и останавливать вручную с помощью процедур RUN_JOB и STOP_JOB. 
 
BEGIN
  -- Запустить джоб в синхронном режиме.
  DBMS_SCHEDULER.run_job (job_name            => 'test_full_job_definition',
                          use_current_session => TRUE);

  -- Остановить джоб.
  DBMS_SCHEDULER.stop_job (job_name => 'test_full_job_definition, test_prog_sched_job_definition');
END;
/


Джобы можно удалить так:

BEGIN
  DBMS_SCHEDULER.drop_job (job_name => 'test_full_job_definition');
  DBMS_SCHEDULER.drop_job (job_name => 'test_prog_sched_job_definition');
  DBMS_SCHEDULER.drop_job (job_name => 'test_prog_job_definition');
  DBMS_SCHEDULER.drop_job (job_name => 'test_sched_job_definition');
END;
/

PL/SQL procedure successfully completed.


Просмотр джобов:

SELECT owner, job_name, enabled FROM dba_scheduler_jobs;

OWNER                          JOB_NAME                       ENABL
------------------------------ ------------------------------ -----
SYS                            PURGE_LOG                      TRUE
SYS                            GATHER_STATS_JOB               TRUE

2 rows selected.


 
Классы джобов:

Классы джобов позволяют группировать задания со схожими характеристиками и требованиями к ресурсам, 
что облегчает администрирование.
Если параметр JOB_CLASS процедуры CREATE_JOB не определен, задание присваивается DEFAULT_JOB_CLASS.


-- Просмотр текущих resource consumer groups.

SELECT consumer_group FROM dba_rsrc_consumer_groups;
CONSUMER_GROUP
------------------------------
OTHER_GROUPS
DEFAULT_CONSUMER_GROUP
SYS_GROUP
LOW_GROUP
AUTO_TASK_CONSUMER_GROUP

5 rows selected.


-- Создание джоб класса:
BEGIN
  DBMS_SCHEDULER.create_job_class (
    job_class_name          =>  'test_job_class',
    resource_consumer_group =>  'low_group');
END;
/

PL/SQL procedure successfully completed.



-- Просмотр классов джобов.

SELECT job_class_name, resource_consumer_group FROM dba_scheduler_job_classes;

JOB_CLASS_NAME                 RESOURCE_CONSUMER_GROUP
------------------------------ ------------------------------
DEFAULT_JOB_CLASS
AUTO_TASKS_JOB_CLASS           AUTO_TASK_CONSUMER_GROUP
TEST_JOB_CLASS                 LOW_GROUP

3 rows selected.



Задания могут быть назначены job class-у либо во время создания джоба
или после создания джоба с использованием процедуры SET_ATTRIBUTE.

BEGIN
  -- Создаём джоб.
  DBMS_SCHEDULER.create_job (
    job_name      => 'test_prog_sched_class_job_def',
    program_name  => 'test_plsql_block_prog',
    schedule_name => 'test_hourly_schedule',
    job_class     => 'test_job_class',
    enabled       => TRUE,
    comments      => 'Job defined by an existing program and schedule and assigned toa job class.');

  -- Назначаем джоб классу.
  DBMS_SCHEDULER.set_attribute (
    name      => 'test_prog_sched_job_definition',
    attribute => 'job_class',
    value     => 'test_job_class');
END;
/

PL/SQL procedure successfully completed.


-- Просмотр джобов.
SELECT owner, job_name, job_class, enabled FROM dba_scheduler_jobs;

OWNER                          JOB_NAME                       JOB_CLASS                      ENABL
------------------------------ ------------------------------ ------------------------------ -----
SYS                            PURGE_LOG                      DEFAULT_JOB_CLASS              TRUE
SYS                            GATHER_STATS_JOB               AUTO_TASKS_JOB_CLASS           TRUE
SYS                            TEST_FULL_JOB_DEFINITION       DEFAULT_JOB_CLASS              TRUE
SYS                            TEST_PROG_SCHED_JOB_DEFINITION TEST_JOB_CLASS                 TRUE
SYS                            TEST_PROG_JOB_DEFINITION       DEFAULT_JOB_CLASS              TRUE
SYS                            TEST_SCHED_JOB_DEFINITION      DEFAULT_JOB_CLASS              TRUE
SYS                            TEST_PROG_SCHED_CLASS_JOB_DEF  TEST_JOB_CLASS                 TRUE

7 rows selected.


Удаление джоб классов:

BEGIN
  DBMS_SCHEDULER.drop_job_class (
    job_class_name => 'test_job_class',
    force          => TRUE);
END;
/

PL/SQL procedure successfully completed.

 
 
Параметр force отключает любые зависимые джлбы и устанавливает для их job class значение по умолчанию.
Если job class не имеет зависимостей, параметр force необязателен. 



 
-- Просмотр джоб классов.

SELECT job_class_name, resource_consumer_group FROM dba_scheduler_job_classes;

JOB_CLASS_NAME                 RESOURCE_CONSUMER_GROUP
------------------------------ ------------------------------
DEFAULT_JOB_CLASS
AUTO_TASKS_JOB_CLASS           AUTO_TASK_CONSUMER_GROUP

2 rows selected.
 
 
Заданию могут назначаться приоритет между 1 и 5 (причем 1 является самым высоким),
которые использует координатор очереди джобов. Если приоритет не назначен, используется приоритет 3.

BEING
  DBMS_SCHEDULER.set_attribute (
    name      => 'my_job', 
    attribute => 'job_priority',
    value     => 1);
END;
/


 
 
 
 
 
 
 
 
 






Solaris /dev/pts

Solaris pts
A pty--also known as pts, pt's, pseudo-tty's--is a remote (pseudo) terminal. Prior to Solaris 8, the default maximum value of pty's is 48. Beginning with Solaris 8, the number of pseudo-terminals increases on demand, as long as the syseventd daemon is running.

Attempting to exceed this value may result in errors such as:

Warning: no access to tty (Bad file number).

Sep 4 12:36:58 hostname sshd[16676]: error: /dev/ptmx: No such device
Sep 4 12:36:58 hostname sshd[16678]: error: session_pty_req: session 0 alloc failed

Determine maximum number of pty's:
# echo "pt_cnt/D" | adb -k
physmem 1f4e9
pt_cnt:
pt_cnt: 48

# ls /dev/pts | wc -l
48

The following is a Bourne shell script to determine the current number of pty's in use and the maximun number of pty's (thanks to Ton Voon for showing me how to determine the current number of pty's in use):

#!/bin/sh

PTYS_IN_USE=0
TOTAL_PTYS=`ls /dev/pts | wc -l | sed 's/ //g`
for PTY in /dev/pts/*
do
[ -n "`fuser $PTY 2>/dev/null`" ] && PTYS_IN_USE=`expr $PTYS_IN_USE + 1`
done
echo "PTYs in use: $PTYS_IN_USE"
echo " Total PTYs: $TOTAL_PTYS"

Example output:

PTYs in use: 7
Total PTYs: 48

The following Bourne shell script shows the PIDs in use for each of the system's pty's:

#!/bin/sh

for PTY in `ls /dev/pts | sort -n` ; do
echo "/dev/pts/$PTY"
PIDS=`fuser /dev/pts/$PTY 2>&1 | awk -F: '{ print $2 }' | tr -d '[a-z][A-Z]'`
ps -fp "$PIDS"
echo
done

Example output:
...
/dev/pts/46
UID PID PPID C STIME TTY TIME CMD
root 13009 12508 0 09:56:16 pts/46 0:00 -sh
root 1141 13009 0 10:58:48 pts/46 0:00 /bin/sh ./pts_to_pid
...

Increasing number of pty's:

1. Add set pt_cnt = number to /etc/system
Note: there is no defined limit to the number of pty's that you create; values greater than 3000 have been used in practice. I recommend setting the number of ptys at multiples of 256 until you reach a comfortable limit.

2. Perform a reconfiguration reboot.

If a reboot (but not reconfiguration reboot) is performed after the kernel parameter change, the pty device links can be created with drvconfig;devlinks

Increasing pty's without a reboot
At least with my tests on a Solaris 2.6 system, this is not possible. This link claims it is possible, but I followed the steps, and it did not work.

# adb -k -w /dev/ksyms /dev/mem
physmem 7dd2c
pt_cnt/D
pt_cnt:
pt_cnt: 48
pt_cnt?W400
pt_cnt: 0x30 = 0x400
$q

# drvconfig;devlinks

After running drvconfig;devlinks, /dev/pts was not populated with the additional pty's, so I created them myself.

#!/bin/sh

# Create pty's 48 - 1023
PTY=48
ENDING_PTY=1023

while [ "$PTY" -le "$ENDING_PTY" ] ; do
mknod /devices/pseudo/pts@0:$PTY c 24 $PTY
chmod 644 /devices/pseudo/pts@0:$PTY
chgrp sys /devices/pseudo/pts@0:$PTY
ln -s ../../devices/pseudo/pts@0:$PTY /dev/pts/$PTY
chgrp -h root /dev/pts/$PTY
PTY=`expr $PTY + 1`
done

Unfortunately, this does not work. This link explains why.

RESOURCE_MANAGER

Основные понятия


По умолчанию менеджер ресурсов отключен и БД обрабатывает все сеансы одинаково.
Но можно настромть resource manager для управления рабочими нагрузками по разному,
настроив группы потребителей (consumer group) и планы ресурсов (resource plan).

consumer group - это набор сессий, которые управляются как единое целое.
Например можно определить consumer groups для каждого приложения
или для каждого типа рабочей нагрузки (OLTP, DSS итд).

resource plan - это директивы, указывающие как ресурсы CPU должны быть распределены
между группами потребителей (consumer group).


Все пользователи (кроме SYS и SYSTEM) по умолчанию относятся к группе: 
DEFAULT_CONSUMER_GROUP

SET SQLFORMAT ANSICONSOLE
SET LINESIZE 32767
SET PAGESIZE 50000


select username,
       initial_rsrc_consumer_group
from dba_users;


USERNAME                 INITIAL_RSRC_CONSUMER_GROUP  
----------------------------------------------------
SYS                       SYS_GROUP                     
SYSTEM                    SYS_GROUP                
     
XS$NULL                   DEFAULT_CONSUMER_GROUP        
OJVMSYS                   DEFAULT_CONSUMER_GROUP        
OUTLN                     DEFAULT_CONSUMER_GROUP        
SYS$UMF                   DEFAULT_CONSUMER_GROUP        
DBSNMP                    DEFAULT_CONSUMER_GROUP        
APPQOSSYS                 DEFAULT_CONSUMER_GROUP        
DBSFWUSER                 DEFAULT_CONSUMER_GROUP        
GGSYS                     DEFAULT_CONSUMER_GROUP        
ANONYMOUS                 DEFAULT_CONSUMER_GROUP        
GSMADMIN_INTERNAL         DEFAULT_CONSUMER_GROUP        
XDB                       DEFAULT_CONSUMER_GROUP        
WMSYS                     DEFAULT_CONSUMER_GROUP        
GSMCATUSER                DEFAULT_CONSUMER_GROUP        
ANGOR                     DEFAULT_CONSUMER_GROUP        
REMOTE_SCHEDULER_AGENT    DEFAULT_CONSUMER_GROUP        
SYSBACKUP                 DEFAULT_CONSUMER_GROUP        
SYSRAC                    DEFAULT_CONSUMER_GROUP        
AUDSYS                    DEFAULT_CONSUMER_GROUP        
DIP                       DEFAULT_CONSUMER_GROUP        
SYSKM                     DEFAULT_CONSUMER_GROUP        
ORACLE_OCM                DEFAULT_CONSUMER_GROUP        
SYSDG                     DEFAULT_CONSUMER_GROUP        
GSMUSER                   DEFAULT_CONSUMER_GROUP        


25 rows selected.


Какие предустановленные группы имеются в БД:

SELECT consumer_group, status, comments
FROM dba_rsrc_consumer_groups;

CONSUMER_GROUP           STATUS   COMMENTS   
---------------------------------------------------------------------------------------------------------------------------------------------                                                                                             
BATCH_GROUP                         Consumer group for batch operations                                                                        
ORA$AUTOTASK                        Consumer group for autotask operations                                                                     
INTERACTIVE_GROUP                   Consumer group for interactive, OLTP operations                                                            
OTHER_GROUPS                        Consumer group for users not included in any consumer group with a directive in the currently active plan  
DEFAULT_CONSUMER_GROUP              Consumer group for users not assigned to any consumer group                                                
SYS_GROUP                           Consumer group for system administrators           
                                                        
LOW_GROUP                           Consumer group for low-priority sessions                                                                   
ETL_GROUP                           Consumer group for ETL                                                                                     
DSS_GROUP                           Consumer group for DSS queries                                                                             
DSS_CRITICAL_GROUP                  Consumer group for critical DSS queries                                                                    
ORA$APPQOS_0                        Consumer group for Application QOS                                                                         
ORA$APPQOS_1                        Consumer group for Application QOS                                                                         
ORA$APPQOS_2                        Consumer group for Application QOS                                                                         
ORA$APPQOS_3                        Consumer group for Application QOS                                                                         
ORA$APPQOS_4                        Consumer group for Application QOS                                                                         
ORA$APPQOS_5                        Consumer group for Application QOS                                                                         
ORA$APPQOS_6                        Consumer group for Application QOS                                                                         
ORA$APPQOS_7                        Consumer group for Application QOS                                                                         


18 rows selected.




Все пользователи, при создании автоматически становятся членами группы
DEFAULT_CONSUMER_GROUP
Эту группу нельзя указывать в директивах плана ресурсов.

Для текущего активного плана ресурсов, все сеансы, которые не определены
в директивах этого плана считаются как "прочие" и относятся к предопределённой группе: 
OTHER_GROUPS.

В группу OTHER_GROUPS нельзя включать пользователей, но в директивах плана её указывать нужно,
чтобы указать сколько ресурсов выделено прочим пользователям.
Все прочие пользователи могут быть членами других групп, не прописанных в директивах текущего
ресурсного плана, а также членами группы DEFAULT_CONSUMER_GROUP, так как эта группа
по определению не должна использоваться в директивах плана ресурсов.


ORA$AUTOTASK  Эта определенная по умолчанию группа потребителей ресурсов используется для автоматически выполняемых задач, таких как генерация статистических данных. Приоритет таких задач, как сбор статистики, будет оставаться ниже приоритета задач, выполняемых в заданной по умолчанию группе потребителей.



Можно создать новую группу:

begin
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();

  dbms_resource_manager.create_consumer_group(
      consumer_group => 'TEST_GROUP',
      comment        => 'TEST group.'
  );
  dbms_resource_manager.submit_pending_area();
end;
/


SELECT consumer_group, status, comments
FROM dba_rsrc_consumer_groups;


CONSUMER_GROUP           STATUS   COMMENTS                                                                                                   
-----------------------------------------------------------------------------------------
BATCH_GROUP                         Consumer group for batch operations                                                                         
ORA$AUTOTASK                        Consumer group for autotask operations                                                                      
INTERACTIVE_GROUP                   Consumer group for interactive, OLTP operations                                                             
OTHER_GROUPS                        Consumer group for users not included in any consumer group with a directive in the currently active plan   
DEFAULT_CONSUMER_GROUP              Consumer group for users not assigned to any consumer group                                                 
SYS_GROUP                           Consumer group for system administrators                                                                    
LOW_GROUP                           Consumer group for low-priority sessions                                                                    
ETL_GROUP                           Consumer group for ETL                                                                                      
DSS_GROUP                           Consumer group for DSS queries                                                                              
DSS_CRITICAL_GROUP                  Consumer group for critical DSS queries                                                                     
ORA$APPQOS_0                        Consumer group for Application QOS                                                                          
ORA$APPQOS_1                        Consumer group for Application QOS                                                                          
ORA$APPQOS_2                        Consumer group for Application QOS                                                                          
ORA$APPQOS_3                        Consumer group for Application QOS                                                                          
ORA$APPQOS_4                        Consumer group for Application QOS                                                                          
ORA$APPQOS_5                        Consumer group for Application QOS                                                                          
ORA$APPQOS_6                        Consumer group for Application QOS                                                                          
ORA$APPQOS_7                        Consumer group for Application QOS                                                                          
TEST_GROUP                          TEST group.                                                                                                 


19 rows selected.



И добавить в неё пользователя:

begin
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();

  dbms_resource_manager.set_consumer_group_mapping(
      attribute => dbms_resource_manager.oracle_user,
      value => 'angor',
      consumer_group => 'TEST_GROUP'
  );
  dbms_resource_manager.submit_pending_area();
end;
/



select username,
       initial_rsrc_consumer_group
from dba_users;

USERNAME                 INITIAL_RSRC_CONSUMER_GROUP 
-----------------------------------------------------
SYS                       SYS_GROUP                     
SYSTEM                    SYS_GROUP                     
XS$NULL                   DEFAULT_CONSUMER_GROUP        
OJVMSYS                   DEFAULT_CONSUMER_GROUP        
OUTLN                     DEFAULT_CONSUMER_GROUP        
SYS$UMF                   DEFAULT_CONSUMER_GROUP        
DBSNMP                    DEFAULT_CONSUMER_GROUP        
APPQOSSYS                 DEFAULT_CONSUMER_GROUP        
DBSFWUSER                 DEFAULT_CONSUMER_GROUP        
GGSYS                     DEFAULT_CONSUMER_GROUP        
ANONYMOUS                 DEFAULT_CONSUMER_GROUP        
GSMADMIN_INTERNAL         DEFAULT_CONSUMER_GROUP        
XDB                       DEFAULT_CONSUMER_GROUP        
WMSYS                     DEFAULT_CONSUMER_GROUP        
ANGOR                     TEST_GROUP                    
GSMCATUSER                DEFAULT_CONSUMER_GROUP        
REMOTE_SCHEDULER_AGENT    DEFAULT_CONSUMER_GROUP        
SYSBACKUP                 DEFAULT_CONSUMER_GROUP        
SYSRAC                    DEFAULT_CONSUMER_GROUP        
AUDSYS                    DEFAULT_CONSUMER_GROUP        
DIP                       DEFAULT_CONSUMER_GROUP        
SYSKM                     DEFAULT_CONSUMER_GROUP        
ORACLE_OCM                DEFAULT_CONSUMER_GROUP        
SYSDG                     DEFAULT_CONSUMER_GROUP        
GSMUSER                   DEFAULT_CONSUMER_GROUP        


25 rows selected.


Автоматическое назначение группы потребителей ресурсов сеансу

Диспетчер ресурсов базы данных может автоматически назначать сеанс пользователя
в конкретную группу потребителей в соответствии с определенными атрибутами сеанса.
Достаточно отобразить атрибуты сеанса на различные группы потребителей,
и при регистрации пользователя подходящая группа потребителей будет присвоена
этому пользователю в соответствии с его атрибутами.

Возникший конфликт может быть разрешен путем назначения приоритетов отображениям
атрибутов сеанса на группы потребителей ресурсов.

Для сопоставления атрибутов сеансов и групп потребителей ресурсов
и определения приоритетов отображения служат две процедуры из пакета DBMS_RESOURCE_MANAGER:

SET_CONSUMER_GROUP_MAPPING
SET_CONSUMER_MAPPING_PRI

Существуют два различных типа атрибутов сеансов.

Первый набор охватывает атрибуты регистрации, которые помогают Database Resource Manager
определить первоначальную группу потребителей для пользователя.

Второй набор атрибутов сеансов состоит из атрибутов времени выполнения.


Ниже перечислены некоторые атрибуты сеанса, которые учитываются при отображении
сеанса пользователя на конкретную группу потребителей ресурсов:


Attribute  (Type)  Description
--------------------------------------------------------------------------------
ORACLE_USER  (Login)  The Oracle Database user name

SERVICE_NAME  (Login)  The service name used by the client to establish a connection

CLIENT_OS_USER  (Login)  The operating system user name of the client that is logging in

CLIENT_PROGRAM  (Login)  The name of the client program used to log into the server

CLIENT_MACHINE  (Login)  The name of the machine from which the client is making the connection

MODULE_NAME  (Runtime)  The module name in the application currently executing as set by the DBMS_APPLICATION_INFO.SET_MODULE procedure or the equivalent OCI attribute setting

MODULE_NAME_ACTION  (Runtime)  A combination of the current module and the action being performed as set by either of the following procedures
or their equivalent OCI attribute setting:
DBMS_APPLICATION_INFO.SET_MODULE
DBMS_APPLICATION_INFO.SET_ACTION

The attribute is specified as the module name followed by a period (.), followed by the action name (module_name.action_name).

SERVICE_MODULE  (Runtime)  A combination of service and module names in this form: service_name.module_name
SERVICE_MODULE_ACTION  (Runtime)  A combination of service name, module name, and action name, in this form: service_name.module_name.action_name


Отображение каждого из этих атрибутов сеанса на конкретную группу потребителей ресурсов
выполняется с помощью процедуры SET_CONSUMER_GROUP_MAPPING.


Иногда между двумя отображениями могут возникать конфликты и для их разрешения  используется процедура:

DBMS_RESOURCE_MANAGER.set_consumer_group_mapping_pri (
  explicit               IN  NUMBER,
  oracle_user            IN  NUMBER,
  service_name           IN  NUMBER,
  client_os_user         IN  NUMBER,
  client_program         IN  NUMBER,
  client_machine         IN  NUMBER,
  module_name            IN  NUMBER,
  module_name_action     IN  NUMBER,
  service_module         IN  NUMBER,
  service_module_action  IN  NUMBER
)

Для разрешения конфликтов назначаются приоритеты.
Параметры сопоставляются с константами, за исключением параметра EXPLICIT, который представляет
явные вызовы для переключения групп потребителей с использованием процедур:

SWITCH_CURRENT_CONSUMER_GROUP
SWITCH_CONSUMER_GROUP_FOR_SESS
SWITCH_CONSUMER_GROUP_FOR_USER


Присвоенные приоритеты должны быть уникальными целыми числами от 1 до 10, где 1 обозначает наивысший приоритет.

BEGIN
  DBMS_RESOURCE_MANAGER.set_consumer_group_mapping_pri (
    explicit              => 1,
    oracle_user           => 2,
    service_name          => 3,
    client_os_user        => 4,
    client_program        => 5,
    client_machine        => 6,
    module_name           => 7,
    module_name_action    => 8,
    service_module        => 9,
    service_module_action => 10
  );
END;
/

Используя приведенный выше пример, ORACLE_USER имеет более высокий приоритет, чем MODULE_NAME.

При изменении атрибута сеанса пользователь автоматически переводится в соответствующую группу потребителей ресурсов.



Можно, например завести сервис:

exec DBMS_SERVICE.CREATE_SERVICE('TSVC','TSVC');
exec DBMS_SERVICE.START_SERVICE('TSVC');

Создать группу ресурсов и включить сервис в эту группу:

BEGIN
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('TGRP','TGRP');
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(DBMS_RESOURCE_MANAGER.SERVICE_NAME,'TSVC','TGRP');
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/

SELECT P.ATTRIBUTE, P.PRIORITY, M.VALUE, M.CONSUMER_GROUP
FROM DBA_RSRC_GROUP_MAPPINGS M, DBA_RSRC_MAPPING_PRIORITY P
WHERE M.STATUS IS NULL
AND P.STATUS IS NULL
AND M.ATTRIBUTE(+) = P.ATTRIBUTE
ORDER BY 2,1,3,4;


ATTRIBUTE                   PRIORITY   VALUE    CONSUMER_GROUP
-----------------------------------------------------------  
EXPLICIT                           1                            
SERVICE_MODULE_ACTION              2                            
SERVICE_MODULE                     3                            
MODULE_NAME_ACTION                 4                            
MODULE_NAME                        5                            
SERVICE_NAME                       6   TSVC      TGRP             
ORACLE_USER                        7   ANGOR     TEST_GROUP       
ORACLE_USER                        7   SYS       SYS_GROUP        
ORACLE_USER                        7   SYSTEM    SYS_GROUP        
CLIENT_PROGRAM                     8                            
CLIENT_OS_USER                     9                            
CLIENT_MACHINE                    10                            
CLIENT_ID                         11                            


13 rows selected.



Для RAC сервисы создаём так:

--Create a service for OLTP sessions
srvctl add service -d orcl -s DBRAC_OLTP -preferred orcl2 -available orcl1
srvctl start service -d orcl -s DBRAC_OLTP

--Create a service for BATCH sessions
srvctl add service -d orcl -s DBRAC_BATCH -preferred orcl2 -available orcl1
srvctl start service -d orcl -s DBRAC_BATCH


 


Просмотр ресурсных планов

Какие планы ресурсов существуют:



SELECT plan, comments FROM dba_rsrc_plans;

PLAN                       COMMENTS                                                                                                                                                              
------------------------------------
MIXED_WORKLOAD_PLAN         Example plan for a mixed workload that prioritizes interactive operations over batch operations                                                                        
DEFAULT_MAINTENANCE_PLAN    Default plan for maintenance windows that prioritizes SYS_GROUP operations, leaving 5% for automated maintenance operations and 20% for other tasks.                   
DEFAULT_PLAN                Default, basic, pre-defined plan that prioritizes SYS_GROUP operations and allocates minimal resources for automated maintenance and diagnostics operations.           
INTERNAL_QUIESCE            Plan for quiescing the database.  This plan cannot be activated  directly.  To activate, use the quiesce command.                                                      
INTERNAL_PLAN               Internally-used plan for disabling the resource manager.                                                                                                               
APPQOS_PLAN                 Plan for Application QOS Management that provides a fixed set of allocations to the consumer groups that Application QOS uses to manage workload resource allocation.  
ETL_CRITICAL_PLAN           Example plan for DSS workloads that prioritizes ETL and critical DSS queries.                                                                                          
ORA$AUTOTASK_PLAN           Plan for global maintenance in a consolidated database. This plan is for internal use only. It cannot be modified.                                                     
ORA$ROOT_PLAN               Plan for administration tasks in the ROOT of a consolidated database. This plan is for internal use only. It cannot be modified.                                       
ORA$QOS_PLAN                Plan for QOS Management that provides a fixed set of allocations to the consumer groups that QOS uses to manage workload resource allocation.                          
DSS_PLAN                    Example plan for DSS workloads that prioritizes DSS queries over ETL.                                                                                                  


11 rows selected.

ORA$AUTOTASK_SUB_PLAN      Определенный по умолчанию подплан для задач  автоматического обслуживания. Директива для этого  подплана должна быть включена в каждый план верхнего уровня, чтобы можно было управлять ресурсами, используемыми задачами автоматического обслуживания.

ORA$AUTOTASK_HIGH_SUB_PLAN Определенный по умолчанию подплан для высокоприоритетных  задач автоматического обслуживания. Обращение к этому подплану выполняется посредством ORA$AUTOTASK_SUB_PLAN  и не должно выполняться непосредственно.



Активировать существующий ресурсный план можно так:

alter system set resource_manager_plan = 'MY_PLAN' scope=both;

Например, существует предопределённый план:
DEFAULT_PLAN


Активировав его:

alter system set resource_manager_plan = 'DEFAULT_PLAN' sid='*';

Мы получим следующие преимущества:

Фоновые процессы, например такие как PMON и LSM не будут нуждаться
в ресурсах процессора из-за чрезмерной нагрузки от foreground процессов.

SYS и SYSTEM запланированы с наивысшим приоритетом.
Время их отклика не будет зависеть от неуправляемого потребления ресурсов CPU обычными пользователями.
Из-под SYS всегда можно будет войти в систему и устранить проблемы с БД

Автоматизированные задачи обслуживания запланированы с наименьшим приоритетом,
значит они не будут конкурировать с другими  сеансами за CPU.

Но, когда рабочая нагрузка БД низкая, то задачи обслуживания будут использовать
любые свободные для использования ресурсы CPU.


Отключить ресурсный менеджер можно так:

ALTER SYSTEM SET resource_manager_plan='';


По умолчанию параметр не установлен.

select name, value, display_value, default_value from v$parameter
where name = 'resource_manager_plan'

NAME                    VALUE   DISPLAY_VALUE   DEFAULT_VALUE 
--------------------------------------------------------------
resource_manager_plan 



Но активный план ресурсов сейчас такой: 

select name, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';

NAME            CPU_MANAGED
-------------------------------------- 
INTERNAL_PLAN    OFF 



Через некоторое время активировался план ресурсов:

select name, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';


NAME                       CPU_MANAGED
-------------------------------------- 
DEFAULT_MAINTENANCE_PLAN    ON      


Этот план был активирован одним из этих окон:

SELECT window_name, resource_plan, enabled, active
FROM   dba_scheduler_windows;

WINDOW_NAME        RESOURCE_PLAN              ENABLED   ACTIVE
----------------------------------------------------------------
MONDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
TUESDAY_WINDOW      DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
WEDNESDAY_WINDOW    DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
THURSDAY_WINDOW     DEFAULT_MAINTENANCE_PLAN    TRUE       TRUE    
FRIDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
SATURDAY_WINDOW     DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
SUNDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN    TRUE       FALSE   
WEEKNIGHT_WINDOW                                FALSE      FALSE   
WEEKEND_WINDOW                                  FALSE      FALSE   


9 rows selected.


Как видим, с окнами связан план ресурсов:

DEFAULT_MAINTENANCE_PLAN

А когда окна открываются, то и активируются связанные с ними планы ресурсов.



Включены ли эти окна в группы?:

select * from DBA_SCHEDULER_WINGROUP_MEMBERS;

WINDOW_GROUP_NAME          WINDOW_NAME      
---------------------------------------------
MAINTENANCE_WINDOW_GROUP    MONDAY_WINDOW     
MAINTENANCE_WINDOW_GROUP    TUESDAY_WINDOW    
MAINTENANCE_WINDOW_GROUP    WEDNESDAY_WINDOW  
MAINTENANCE_WINDOW_GROUP    THURSDAY_WINDOW   
MAINTENANCE_WINDOW_GROUP    FRIDAY_WINDOW     
MAINTENANCE_WINDOW_GROUP    SATURDAY_WINDOW   
MAINTENANCE_WINDOW_GROUP    SUNDAY_WINDOW     
ORA$AT_WGRP_OS              MONDAY_WINDOW     
ORA$AT_WGRP_OS              TUESDAY_WINDOW    
ORA$AT_WGRP_OS              WEDNESDAY_WINDOW  
ORA$AT_WGRP_OS              THURSDAY_WINDOW   
ORA$AT_WGRP_OS              FRIDAY_WINDOW     
ORA$AT_WGRP_OS              SATURDAY_WINDOW   
ORA$AT_WGRP_OS              SUNDAY_WINDOW     
ORA$AT_WGRP_SA              MONDAY_WINDOW     
ORA$AT_WGRP_SA              TUESDAY_WINDOW    
ORA$AT_WGRP_SA              WEDNESDAY_WINDOW  
ORA$AT_WGRP_SA              THURSDAY_WINDOW   
ORA$AT_WGRP_SA              FRIDAY_WINDOW     
ORA$AT_WGRP_SA              SATURDAY_WINDOW   
ORA$AT_WGRP_SA              SUNDAY_WINDOW     
ORA$AT_WGRP_SQ              MONDAY_WINDOW     
ORA$AT_WGRP_SQ              TUESDAY_WINDOW    
ORA$AT_WGRP_SQ              WEDNESDAY_WINDOW  
ORA$AT_WGRP_SQ              THURSDAY_WINDOW   
ORA$AT_WGRP_SQ              FRIDAY_WINDOW     
ORA$AT_WGRP_SQ              SATURDAY_WINDOW   
ORA$AT_WGRP_SQ              SUNDAY_WINDOW     


28 rows selected.


Как видим, эти окна являются членами групп:

MAINTENANCE_WINDOW_GROUP
ORA$AT_WGRP_OS
ORA$AT_WGRP_SA
ORA$AT_WGRP_SQ


Смотрим когда будут открываться окна из этих групп:

select window_group_name,
       enabled,
       number_of_windows,
       TO_CHAR(TO_TIMESTAMP_TZ(next_start_date, 'DD-MON-YY HH:MI:SS.FF AM TZH:TZM'), 'dd/mm/yyyy hh24:mi:ss') win_start_time,
       comments
from dba_scheduler_window_groups;

WINDOW_GROUP_NAME          ENABLED   NUMBER_OF_WINDOWS   WIN_START_TIME        COMMENTS              
-------------------------------------------------------------------------------------------------------------------------               
MAINTENANCE_WINDOW_GROUP    TRUE                     7   05/07/2019 22:00:00   Window group for Automated Maintenance  
ORA$AT_WGRP_OS              TRUE                     7   05/07/2019 22:00:00   auto optimizer stats collection         
ORA$AT_WGRP_SA              TRUE                     7   05/07/2019 22:00:00   auto space advisor                      
ORA$AT_WGRP_SQ              TRUE                     7   05/07/2019 22:00:00   sql tuning advisor

Видим, что в каждой группе по 7 окон и очередные окна будут открываться в 22 часа.


Посмотрим расписание открытия этих окон:

select WINDOW_NAME,
       RESOURCE_PLAN,
       REPEAT_INTERVAL,
       (extract (second from DURATION)
       + (extract (minute from DURATION)
       + (extract (hour from DURATION)
       + (extract (day from DURATION) * 24) ) * 60 ) * 60)/3600 DURATION_HOURS,
       ENABLED
from DBA_SCHEDULER_WINDOWS
where WINDOW_NAME in (select WINDOW_NAME
                        from DBA_SCHEDULER_WINGROUP_MEMBERS
                       where WINDOW_GROUP_NAME='MAINTENANCE_WINDOW_GROUP');


WINDOW_NAME        RESOURCE_PLAN              REPEAT_INTERVAL                                         DURATION_HOURS ENABLED 
-------------------------------------------------------------------------------------------------------------------------------
WEDNESDAY_WINDOW    DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0                4 TRUE     
THURSDAY_WINDOW     DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0                4 TRUE     
SATURDAY_WINDOW     DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0                20 TRUE     
SUNDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0                20 TRUE     
FRIDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0                4 TRUE     
MONDAY_WINDOW       DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0                4 TRUE     
TUESDAY_WINDOW      DEFAULT_MAINTENANCE_PLAN  freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0                4 TRUE     


7 rows selected.


Как видим, все окна в состоянии  ENABLED=TRUE



Смотрим, какие клиенты используют данные auto task группы окон,
в качестве расписания для своего запуска:


select client_name,
       consumer_group,
       window_group,
       status
from DBA_AUTOTASK_CLIENT;

CLIENT_NAME                       CONSUMER_GROUP   WINDOW_GROUP     STATUS  
------------------------------------------------------------------------------
sql tuning advisor                 ORA$AUTOTASK      ORA$AT_WGRP_SQ    ENABLED  
auto optimizer stats collection    ORA$AUTOTASK      ORA$AT_WGRP_OS    ENABLED  
auto space advisor                 ORA$AUTOTASK      ORA$AT_WGRP_SA    ENABLED

Также видим, что задачи будут выполняться в рамках consumer group: ORA$AUTOTASK


Смотрим какие автоматические задачи выполняют данные клиенты: 

select client_name,
       operation_name,
       status
from DBA_AUTOTASK_OPERATION;

LIENT_NAME                       OPERATION_NAME              STATUS  
-----------------------------------------------------------------------
auto optimizer stats collection    auto optimizer stats job     ENABLED  
auto space advisor                 auto space advisor job       ENABLED  
sql tuning advisor                 automatic sql tuning task    ENABLED  



Смотрим что все автоматические задачи готовы к выполнению:
Всё в статусе enabled


select window_name,
to_char (window_next_time, 'dd/mm/yyyy hh24:mi:ss') window_next_time,
window_active,
autotask_status,
optimizer_stats,
segment_advisor,
sql_tune_advisor
from DBA_AUTOTASK_WINDOW_CLIENTS;

WINDOW_NAME        WINDOW_NEXT_TIME      WINDOW_ACTIVE   AUTOTASK_STATUS   OPTIMIZER_STATS   SEGMENT_ADVISOR   SQL_TUNE_ADVISOR 
--------------------------------------------------------------------------------------------------------------------------------
MONDAY_WINDOW       08/07/2019 22:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
TUESDAY_WINDOW      09/07/2019 22:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
WEDNESDAY_WINDOW    10/07/2019 22:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
THURSDAY_WINDOW     11/07/2019 22:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
FRIDAY_WINDOW       05/07/2019 22:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
SATURDAY_WINDOW     06/07/2019 06:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           
SUNDAY_WINDOW       07/07/2019 06:00:00    FALSE            ENABLED            ENABLED            ENABLED            ENABLED           


7 rows selected.


Смотрим статус последних выполнений данных задач:

select client_name,
       task_name,
       operation_name,
       status,
       last_try_result
from DBA_AUTOTASK_TASK;


CLIENT_NAME                       TASK_NAME                 OPERATION_NAME              STATUS    LAST_TRY_RESULT
----------------------------------------------------------------------------------------------------------------- 
sql tuning advisor                 AUTO_SQL_TUNING_PROG       automatic sql tuning task    ENABLED    SUCCEEDED        
auto optimizer stats collection    gather_stats_prog          auto optimizer stats job     ENABLED    SUCCEEDED        
auto space advisor                 auto_space_advisor_prog    auto space advisor job       ENABLED    SUCCEEDED



Можно посмотреть, что окна действително открывались с определённой продолжительностью:

select window_name,
       to_char (start_time, 'dd/mm/yyyy hh24:mi:ss') s_time,
       (extract (second from DURATION)
       + (extract (minute from DURATION)
       + (extract (hour from DURATION)
       + (extract (day from DURATION) * 24) ) * 60 ) * 60)/3600 DURATION_HOURS
from DBA_AUTOTASK_SCHEDULE
order by start_time desc;

WINDOW_NAME        S_TIME                DURATION_HOURS 
-------------------------------------------------------------
MONDAY_WINDOW       05/08/2019 22:00:00                    4
SUNDAY_WINDOW       04/08/2019 06:00:00                   20
SATURDAY_WINDOW     03/08/2019 06:00:00                   20
FRIDAY_WINDOW       02/08/2019 22:00:00                    4
THURSDAY_WINDOW     01/08/2019 22:00:00                    4
WEDNESDAY_WINDOW    31/07/2019 22:00:00                    4
TUESDAY_WINDOW      30/07/2019 22:00:00                    4
MONDAY_WINDOW       29/07/2019 22:00:00                    4
SUNDAY_WINDOW       28/07/2019 06:00:00                   20
SATURDAY_WINDOW     27/07/2019 06:00:00                   20
FRIDAY_WINDOW       26/07/2019 22:00:00                    4
THURSDAY_WINDOW     25/07/2019 22:00:00                    4
WEDNESDAY_WINDOW    24/07/2019 22:00:00                    4
TUESDAY_WINDOW      23/07/2019 22:00:00                    4
MONDAY_WINDOW       22/07/2019 22:00:00                    4
SUNDAY_WINDOW       21/07/2019 06:00:00                   20
SATURDAY_WINDOW     20/07/2019 06:00:00                   20
FRIDAY_WINDOW       19/07/2019 22:00:00                    4
THURSDAY_WINDOW     18/07/2019 22:00:00                    4
WEDNESDAY_WINDOW    17/07/2019 22:00:00                    4



Когда окна в последний раз открывались и закрывались:

select window_name,
       to_char (window_start_time, 'dd/mm/yyyy hh24:mi:ss') win_start_time,
       to_char (window_end_time, 'dd/mm/yyyy hh24:mi:ss') win_end_time
from DBA_AUTOTASK_WINDOW_HISTORY
order by window_start_time desc;

WINDOW_NAME        WIN_START_TIME        WIN_END_TIME
--------------------------------------------------------------        
THURSDAY_WINDOW     04/07/2019 22:00:00    05/07/2019 02:00:00  
WEDNESDAY_WINDOW    03/07/2019 22:00:00    04/07/2019 02:00:00  
TUESDAY_WINDOW      02/07/2019 22:00:00    03/07/2019 02:00:00  
MONDAY_WINDOW       01/07/2019 22:00:00    02/07/2019 02:00:00  
SUNDAY_WINDOW       30/06/2019 06:00:00    01/07/2019 02:00:00  
SATURDAY_WINDOW     29/06/2019 06:00:00    30/06/2019 02:00:00  
FRIDAY_WINDOW       28/06/2019 22:00:00    29/06/2019 02:00:00  
WEDNESDAY_WINDOW    26/06/2019 22:00:00    27/06/2019 02:00:00  
MONDAY_WINDOW       24/06/2019 22:00:00    25/06/2019 02:00:00  
SUNDAY_WINDOW       23/06/2019 06:00:00    24/06/2019 02:00:00  
SATURDAY_WINDOW     22/06/2019 06:00:00    23/06/2019 02:00:00  
FRIDAY_WINDOW       21/06/2019 22:00:00    22/06/2019 02:00:00  
THURSDAY_WINDOW     20/06/2019 22:00:00    21/06/2019 02:00:00  
WEDNESDAY_WINDOW    19/06/2019 22:00:00    20/06/2019 02:00:00  
TUESDAY_WINDOW      18/06/2019 22:00:00    19/06/2019 02:00:00  


15 rows selected.



Какие автоматические задачи запускались в конкретных окнах:

select client_name,
       window_name,
       to_char (window_start_time, 'dd/mm/yyyy hh24:mi:ss') win_start_time,
       to_char ((extract (second from WINDOW_DURATION)
       + (extract (minute from WINDOW_DURATION)
       + (extract (hour from WINDOW_DURATION)
       + (extract (day from WINDOW_DURATION) * 24) ) * 60 ) * 60)/3600, '99990.9999') WIN_DURATION_HOURS,
       to_char (window_end_time, 'dd/mm/yyyy hh24:mi:ss') win_end_time
from DBA_AUTOTASK_CLIENT_HISTORY
order by window_start_time desc;



CLIENT_NAME                       WINDOW_NAME        WIN_START_TIME        WIN_DURATION_HOURS   WIN_END_TIME
-----------------------------------------------------------------------------------------------------------------------       
auto optimizer stats collection    THURSDAY_WINDOW     04/07/2019 22:00:00         4.0000           05/07/2019 02:00:00  
auto space advisor                 THURSDAY_WINDOW     04/07/2019 22:00:00         4.0000           05/07/2019 02:00:00  
sql tuning advisor                 THURSDAY_WINDOW     04/07/2019 22:00:00         4.0000           05/07/2019 02:00:00  
auto optimizer stats collection    WEDNESDAY_WINDOW    03/07/2019 22:00:00         4.0000           04/07/2019 02:00:00  
auto space advisor                 WEDNESDAY_WINDOW    03/07/2019 22:00:00         4.0000           04/07/2019 02:00:00  
sql tuning advisor                 WEDNESDAY_WINDOW    03/07/2019 22:00:00         4.0000           04/07/2019 02:00:00  
auto optimizer stats collection    TUESDAY_WINDOW      02/07/2019 22:00:00         4.0000           03/07/2019 02:00:00  
auto space advisor                 TUESDAY_WINDOW      02/07/2019 22:00:00         4.0000           03/07/2019 02:00:00  
sql tuning advisor                 TUESDAY_WINDOW      02/07/2019 22:00:00         4.0000           03/07/2019 02:00:00  
auto optimizer stats collection    MONDAY_WINDOW       01/07/2019 22:00:00         4.0000           02/07/2019 02:00:00  



Сколько длились и как завершились задачи в конкретных окнах:

select client_name,
       to_char (window_start_time, 'dd/mm/yyyy hh24:mi:ss') win_start_time,
       to_char ((extract (second from WINDOW_DURATION)
       + (extract (minute from WINDOW_DURATION)
       + (extract (hour from WINDOW_DURATION)
       + (extract (day from WINDOW_DURATION) * 24) ) * 60 ) * 60)/3600, '99990.9999') WIN_DURATION_HOURS,
       to_char (job_start_time, 'dd/mm/yyyy hh24:mi:ss') job_start_time,
       to_char ((extract (second from JOB_DURATION)
       + (extract (minute from JOB_DURATION)
       + (extract (hour from JOB_DURATION)
       + (extract (day from JOB_DURATION) * 24) ) * 60 ) * 60)/3600, '99990.9999') JOB_DURATION_HOURS,
       job_status,
       job_error
from DBA_AUTOTASK_JOB_HISTORY
order by window_start_time desc;


CLIENT_NAME                       WIN_START_TIME        WIN_DURATION_HOURS   JOB_START_TIME        JOB_DURATION_HOURS   JOB_STATUS   JOB_ERROR 
-------------------------------------------------------------------------------------------------------------------------------------------------------
auto space advisor                 04/07/2019 22:00:00         4.0000           04/07/2019 22:00:00         0.0011           SUCCEEDED                0
sql tuning advisor                 04/07/2019 22:00:00         4.0000           04/07/2019 22:00:00         0.0489           SUCCEEDED                0
auto optimizer stats collection    04/07/2019 22:00:00         4.0000           04/07/2019 22:00:00         0.0625           SUCCEEDED                0
sql tuning advisor                 03/07/2019 22:00:00         4.0000           03/07/2019 22:00:02         0.0681           SUCCEEDED                0
auto space advisor                 03/07/2019 22:00:00         4.0000           03/07/2019 22:00:02         0.0011           SUCCEEDED                0
auto optimizer stats collection    03/07/2019 22:00:00         4.0000           03/07/2019 22:00:02         0.0797           SUCCEEDED                0
auto optimizer stats collection    02/07/2019 22:00:00         4.0000           02/07/2019 22:00:01         0.0817           SUCCEEDED                0
sql tuning advisor                 02/07/2019 22:00:00         4.0000           02/07/2019 22:00:01         0.0583           SUCCEEDED                0
auto space advisor                 02/07/2019 22:00:00         4.0000           02/07/2019 22:00:01         0.0025           SUCCEEDED                0
auto optimizer stats collection    01/07/2019 22:00:00         4.0000           01/07/2019 22:00:00         0.1286           SUCCEEDED                0
auto space advisor                 01/07/2019 22:00:00         4.0000           01/07/2019 22:00:00         0.0019           SUCCEEDED                0
sql tuning advisor                 01/07/2019 22:00:00         4.0000           01/07/2019 22:00:00         0.1606           SUCCEEDED                0
auto space advisor                 30/06/2019 06:00:00        20.0000           30/06/2019 06:00:01         0.0011           SUCCEEDED                0
auto optimizer stats collection    30/06/2019 06:00:00        20.0000           30/06/2019 14:24:48         0.0069           SUCCEEDED                0





Директивы ресурсных планов:

select plan,
       group_or_subplan,
       mgmt_p1,
       mgmt_p2,
       mgmt_p3,
       switch_group,
       switch_for_call,
       switch_time,
       max_utilization_limit,
       switch_time_in_call,
       utilization_limit,
       mandatory 
FROM dba_rsrc_plan_directives




PLAN                       GROUP_OR_SUBPLAN      MGMT_P1  MGMT_P2  MGMT_P3 SWITCH_GROUP  SWITCH_FOR_CALL SWITCH_TIME  MAX_UTILIZ_LIMIT    SWITCH_TIME_IN_CALL UTILIZ_LIMIT MANDATORY  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MIXED_WORKLOAD_PLAN         SYS_GROUP                 75        0        0               FALSE                                                                             NO          
MIXED_WORKLOAD_PLAN         OTHER_GROUPS               2        0        0               FALSE                                                                             NO          
MIXED_WORKLOAD_PLAN         INTERACTIVE_GROUP         20        0        0 BATCH_GROUP   TRUE                     60                                       60              NO          
MIXED_WORKLOAD_PLAN         BATCH_GROUP                2        0        0               FALSE                                                                             NO          
MIXED_WORKLOAD_PLAN         ORA$AUTOTASK               1        0        0               FALSE                                      90                                  90 NO          

DEFAULT_MAINTENANCE_PLAN    SYS_GROUP                 75        0        0               FALSE                                                                             NO          
DEFAULT_MAINTENANCE_PLAN    OTHER_GROUPS              20        0        0               FALSE                                                                             NO          
DEFAULT_MAINTENANCE_PLAN    ORA$AUTOTASK               5        0        0               FALSE                                      90                                  90 NO          
DEFAULT_PLAN                SYS_GROUP                 90        0        0               FALSE                                                                             NO          
DEFAULT_PLAN                OTHER_GROUPS               9        0        0               FALSE                                                                             NO          
DEFAULT_PLAN                ORA$AUTOTASK               1        0        0               FALSE                                      90                                  90 NO          

INTERNAL_QUIESCE            SYS_GROUP                  0        0        0               FALSE                                                                             YES         
INTERNAL_QUIESCE            OTHER_GROUPS               0        0        0               FALSE                                                                             YES         
INTERNAL_PLAN               SYS_GROUP                 90        0        0               FALSE                                                                             YES         
INTERNAL_PLAN               OTHER_GROUPS               9        0        0               FALSE                                                                             YES         
INTERNAL_PLAN               ORA$AUTOTASK               1        0        0               FALSE                                      90                                  90 YES         

DSS_PLAN                    SYS_GROUP                 75        0        0               FALSE                                                                             NO          
DSS_PLAN                    DSS_CRITICAL_GROUP        18        0        0               FALSE                                                                             NO          
DSS_PLAN                    DSS_GROUP                  3        0        0               FALSE                                                                             NO          
DSS_PLAN                    ETL_GROUP                  1        0        0               FALSE                                                                             NO          
DSS_PLAN                    BATCH_GROUP                1        0        0               FALSE                                                                             NO          
DSS_PLAN                    ORA$AUTOTASK               1        0        0               FALSE                                      90                                  90 NO          
DSS_PLAN                    OTHER_GROUPS               1        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           SYS_GROUP                 75        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           DSS_CRITICAL_GROUP         8        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           DSS_GROUP                  3        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           ETL_GROUP                  8        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           BATCH_GROUP                3        0        0               FALSE                                                                             NO          
ETL_CRITICAL_PLAN           ORA$AUTOTASK               1        0        0               FALSE                                      90                                  90 NO          
ETL_CRITICAL_PLAN           OTHER_GROUPS               2        0        0               FALSE                                                                             NO          

ORA$AUTOTASK_PLAN           ORA$AUTOTASK               0        0        0               FALSE                                                                             YES         
ORA$ROOT_PLAN               SYS_GROUP                 75        0        0               FALSE                                                                             YES         
ORA$ROOT_PLAN               OTHER_GROUPS              25        0        0               FALSE                                                                             YES         

ORA$QOS_PLAN                SYS_GROUP                100        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                ORA$APPQOS_0              57        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                ORA$APPQOS_1              26        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                ORA$APPQOS_2              12        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                ORA$APPQOS_3               5        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                OTHER_GROUPS               1        0        0               FALSE                                                                             NO          
ORA$QOS_PLAN                ORA$AUTOTASK               1        0        0               FALSE                                                                             NO          
APPQOS_PLAN                 SYS_GROUP                 75        0        0               FALSE                                                                             NO          
APPQOS_PLAN                 ORA$APPQOS_0               0       57        0               FALSE                                                                             NO          
APPQOS_PLAN                 ORA$APPQOS_1               0       26        0               FALSE                                                                             NO          
APPQOS_PLAN                 ORA$APPQOS_2               0       12        0               FALSE                                                                             NO          
APPQOS_PLAN                 ORA$APPQOS_3               0        5        0               FALSE                                                                             NO          
APPQOS_PLAN                 OTHER_GROUPS               0        0       80               FALSE                                                                             NO          
APPQOS_PLAN                 ORA$AUTOTASK               0        0       20               FALSE                                                                             NO   
       


47 rows selected.




Выдача привилегий:

Для администрирования диспетчера ресурсов у вас должна быть системная привилегия ADMINISTER_RESOURCE_MANAGER.
Эта привилегия (with the ADMIN option) предоставляется администраторам баз данных через роль DBA.
Для предоставления и отмены этого используются процедуры GRANT_SYSTEM_PRIVILEGE и
REVOKE_SYSTEM_PRIVILEGE пакета DBMS_RESOURCE_MANAGER_PRIVS.

begin
dbms_resource_manager_privs.grant_system_privilege(
grantee_name => 'DBADMIN',
admin_option => false);
end;
/

Проверка:

select * from dba_sys_privs where grantee='DBADMIN';


Отзыв привилегий:

begin
dbms_resource_manager_privs.revoke_system_privilege(
revokee_name => 'DBADMIN');
end;
/


Привилегии для автоматического переключения на ресурсную группу:

Чтобы назначить пользователей для групп потребителей ресурсов, отличных от стандартных,
пользователям должна быть предоставлена системная привилегия grant_switch_consumer_group, чтобы иметь возможность переключаться на эту группу потребителей.
Для предоставления и отмены этого используются процедуры GRANT_SWITCH_CONSUMER_GROUP и REVOKE_SWITCH_CONSUMER_GROUP пакета DBMS_RESOURCE_MANAGER_PRIVS.


Выдача привилегий:


begin
dbms_resource_manager_privs.grant_switch_consumer_group(
grantee_name => 'PUBLIC',
consumer_group => 'GROUP_NAME');
end;
/

Отзыв привилегий:
begin
dbms_resource_manager_privs.revoke_switch_consumer_group(
revokee_name => 'PUBLIC',
consumer_group => 'GROUP_NAME');
end;
/




Для активации Database Resource Manager , выполните:

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = mydb_plan;


Для деактивации Database Resource Manager , выполните:

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';

База данных может иметь несколько планов, но только один может быть активен в данный момент времени для каждого экземпляра.
Различные экземпляры RAC могут при необходимости активировать различные планы.



Создание простого плана ресурсов с использованием процедуры CREATE_SIMPLE_PLAN

Вы можете указать до восьми групп пользователей с этой процедурой. Единственный способ выделения ресурсов - это процессор.
В плане используется политика распределения ЦП EMPHASIS (по умолчанию),
и каждая группа потребителей использует политику планирования ROUND_ROBIN (также по умолчанию).
Следующий блок PL/SQL создает простой план ресурсов с двумя пользовательскими группами пользователей:

BEGIN
 DBMS_RESOURCE_MANAGER.CREATE_SIMPLE_PLAN(SIMPLE_PLAN => 'mydb_plan',
  CONSUMER_GROUP1 => 'MYGROUP1', GROUP1_PERCENT => 80,
  CONSUMER_GROUP2 => 'MYGROUP2', GROUP2_PERCENT => 20);
END;
/


Executing the preceding statements creates the following plan:

Consumer Group    Level 1    Level 2    Level 3

SYS_GROUP         100%                -               -
MYGROUP1                 -          80%                -
MYGROUP2                 -          20%                -
OTHER_GROUPS        -                 -       100%


Каждая группа потребителей, указанная в плане, выделяет свой процент CPU на уровне 2.
Также неявно включены в план SYS_GROUP (группа, определяемая системой, которая является исходной группой потребителей для пользователей SYS и SYSTEM)
и OTHER_GROUPS.
Группе потребителей SYS_GROUP выделяется 100% CPU на уровне 1,
а OTHER_GROUPS выделяется 100% ЦП на уровне 3.



Список некоторых часто используемых параметров процедуры CREATE_PLAN_DIRECTIVE:


SWITCH_GROUP:
NULL, consumer_group_name, CANCEL_SQL, KILL_SESSION, LOG_ONLY.
Эти параметры определяют "что делать" или "куда переключаться"

SWITCH_TIME:
Определяет время на процессоре (не истекшее время), которое сеанс может выполнить до того,
как будет предпринято действие.
По умолчанию NULL, что означает UNLIMITED.
Как и в случае с другими директивами switch, если switch_for_call равен TRUE,
количество использованного процессорного времени накапливается с начала вызов.
В противном случае количество использованного процессорного времени накапливается на протяжении сеанса.

SWITCH_ESTIMATE:
Если TRUE, база данных оценивает время выполнения каждого вызова,
и если предполагаемое время выполнения превышает SWITCH_TIME,
сеанс переключается на SWITCH_GROUP до начала вызова. По умолчанию FALSE.
Оценка времени выполнения получается из оптимизатора. Точность оценки зависит от многих факторов,
особенно от качества статистики оптимизатора.
В целом, вы должны ожидать, что статистика будет не более точной, чем ± 10 минут.

SWITCH_IO_MEGABYTES:
Определяет количество операций ввода-вывода (в МБ), которое может выполнить сеанс до выполнения действия.
По умолчанию NULL, что означает UNLIMITED.
Как и в случае с другими директивами switch, если switch_for_call равен TRUE,
количество логических операций ввода-вывода накапливается с начала вызова.
В противном случае количество логических операций ввода-вывода накапливается на протяжении сеанса.
Действие определяется SWITCH_GROUP.

SWITCH_IO_REQS:
Задает количество запросов ввода-вывода, которые сеанс может выполнить до выполнения действия.
По умолчанию NULL, что означает UNLIMITED.
Как и в случае с другими директивами switch, если switch_for_call равен TRUE,
количество логических операций ввода-вывода накапливается с начала вызова.
В противном случае количество логических операций ввода-вывода накапливается на протяжении сеанса.
Действие определяется SWITCH_GROUP.

SWITCH_FOR_CALL:
Если TRUE, сеанс, который был автоматически переключен на другую группу потребителей
согласно (switch_time, switch_io_megabytes, switch_io_reqs, switch_io_logical или switch_elapsed_time),
возвращается в свою исходную группу потребителей, когда завершается вызов верхнего уровня.
По умолчанию FALSE, это означит что новая группа потребителей останется до завершения сеанса.
(Для WEB серверов сеансы сохраняем и ставим TRUE)

SWITCH_IO_LOGICAL:
Количество логических операций ввода-вывода, которые запустят действие, указанное switch_group.
Как и в случае с другими директивами switch, если switch_for_call равен TRUE,
количество логических операций ввода-вывода накапливается с начала вызова.
В противном случае количество логических операций ввода-вывода накапливается на протяжении сеанса.

SWITCH_ELAPSED_TIME:
Истёкшее время, которое запустит действие, указанное switch_group. Как и в других директивах switch,
если switch_for_call имеет значение TRUE, истекшее время накапливается с начала вызова.
В противном случае истекшее время накапливается для продолжительности сеанса.


Допустимые значения параметра SWITCH_GROUP описаны ниже:

NULL: автоматическое переключение групп потребителей не включено для этой директивы плана.
consumer_group_name: группа потребителей, к которой должен быть переключен сеанс/вызов, если достигнут порог.
CANCEL_SQL: если порог достигнут, текущий вызов отменяется, но сеанс не прерывается.
KILL_SESSION: если порог достигнут, текущий сеанс прерывается.
LOG_ONLY: если порог достигнут, событие регистрируется в SQL Monitor, но реально ничего не происходит с вызовом или сеансом.

Для всех параметров, связанных с переключателем, существует эквивалентный параметр NEW_ *
для изменения значений с помощью процедуры UPDATE_PLAN_DIRECTIVE.

V$SQL_MONITOR

Представление V$SQL_MONITOR включает четыре новых столбца менеджера ресурсов.

RM_LAST_ACTION: CANCEL_SQL, KILL_SESSION, LOG_ONLY, SWITCH TO < CG NAME >
RM_LAST_ACTION_REASON: SWITCH_CPU_TIME, SWITCH_IO_REQS, SWITCH_IO_MBS, SWITCH_ELAPSED_TIME, SWITCH_IO_LOGICAL
RM_LAST_ACTION_TIME: время последнего действия менеджера ресурсов.
RM_CONSUMER_GROUP: текущая группа потребителей.


Диспетчер ресурсов с базами данных контейнеров (CDB) и сменными базами данных (PDB)

В мультитеннентной среде менеджер ресурсов выполняет две отдельные задачи. На уровне CDB он контролирует ресурсы,
выделенные для каждой PDB, позволяя вам расставлять приоритеты для одних PDB над другими. На уровне PDB он контролирует ресурсы,
выделенные для каждого сеанса, подключенного к PDB, позволяя вам расставлять приоритеты для одних сеансов над другими





Создание комплексного плана ресурсов с использованием процедуры CREATE_PLAN

Сложный план ресурсов - это любой план ресурсов, который не создается с помощью процедуры CREATE_SIMPLE_PLAN.
Обратите внимание, что любой план ресурсов, созданный методом Simple Resource Plan с использованием CREATE_SIMPLE_PLAN,
также может быть создан методом комплексного ресурсного плана (this),
а также создание плана ресурсов с помощью этого метода дает большую гибкость и может иметь большую детализацию.
Когда ваша ситуация требует более сложного плана ресурсов,
вы должны создать план с его директивами и группами потребителей в промежуточной области,
называемой отложенной областью, а затем проверить план перед сохранением в словаре данных.
Вы можете создавать подпланы (план в планах) для более грамотного управления ресурсами.
Если потребительская группа не использует свой процент CPU, остаток переходит на следующий уровень,
и администратор может четко определить, что с ним делать. Можно указать до восьми уровней.


Ниже приведено общее руководство по выполнению плана менеджера баз данных:

1. Создайте планы ресурсов
2. Создание групп потребителей ресурсов
3. Создайте директивы плана ресурсов
4. Предоставить привилегии переключателя для групп пользователей ресурсов пользователям или ролям
5. Назначьте пользователей в группы пользователей ресурсов
6. Укажите план, который будет использоваться экземпляром

В дополнение к вышеуказанным шагам нам необходимо создать эти элементы в промежуточной области, называемой ожидающей областью,
поэтому приведенные ниже шаги относятся к области ожидания, которая может повторяться каждый раз для создания,
проверки и отправки этой ожидающей области.

1. Создание ожидающей области
2. Проверка области ожидания
3. Отправка ожидающей области

Следующий пример присваивает 80% ресурсов CPU сессиям в OLTP-группе и 10% для ADHOC и 10% для каждой группы BATCH.
предполагая, что мы создали 3 пользователей, ADHOC, BATCH и OLTP и назначили группу потребителей для каждого из них.
ЦП-ресурсы распределяются по всем группам потребителей по процентам, предоставленным каждой группе.
Указание нулевого процента для группы потребителей означает, что он не должен получать какие-либо ресурсы обработки на этом уровне,
учитывая потребление ЦП на 100%.
Это может заставить сеансы для этой группы потребителей долго ждать в перегруженной системе.
Это не означает, что пользователи, принадлежащие OTHER_GROUPS (с 0%), никогда не смогут запускаться,
но для полностью загруженной системы сеансы для OTHER_GROUPS должны ждать, пока остальные закончат работу.
Если это единственный активный сеанс, конечно, разрешено использовать все доступные ресурсы ЦП до 100%.
Но если другой сеанс запущен в другой группе, диспетчер ресурсов будет балансировать ресурсы ЦП в соответствии с директивами плана.


---Create pending area for plan, consumer group and directives
begin
 dbms_resource_manager.create_pending_area();
end;
/

---1. Create resource plans
begin
 dbms_resource_manager.create_plan(
  plan => 'MYDB_PLAN',
  comment => 'Resource plan/method for Single level sample');
end;
/

---2. Create resource consumer groups
begin
 dbms_resource_manager.create_consumer_group(
  consumer_group => 'OLTP_Group',
  comment => 'Resource consumer group/method for online users sessions');
 dbms_resource_manager.create_consumer_group(
  consumer_group => 'BATCH_Group',
  comment => 'Resource consumer group/method for users sessions who run batch jobs');
 dbms_resource_manager.create_consumer_group(
  consumer_group => 'ADHOC_Group',
  comment => 'Resource consumer group/method for users sessions who execute Ad-Hoc Queries');
end;
/

---3. Create resource plan directives
begin
 dbms_resource_manager.create_plan_directive(
   plan => 'mydb_plan',
   group_or_subplan => 'OLTP_Group',
   comment => 'Online day users sessions at level 1',
   cpu_p1 => 80,
   parallel_degree_limit_p1 => 0);
 dbms_resource_manager.create_plan_directive(
   plan => 'mydb_plan',
   group_or_subplan => 'BATCH_Group',
   comment => 'batch day users sessions at level 1',
   cpu_p1 => 10,
   parallel_degree_limit_p1 => 10);
 dbms_resource_manager.create_plan_directive(
   plan => 'mydb_plan',
   group_or_subplan => 'ADHOC_Group',
   comment => 'ADHOC day users sessions at level 1',
   cpu_p1 => 10,
   parallel_degree_limit_p1 => 5);
 dbms_resource_manager.create_plan_directive(
   plan => 'mydb_plan',
   group_or_subplan => 'OTHER_GROUPS',
   comment => 'OTHER_GROUPS day users sessions at level 1',
   cpu_p1 => 0,
   parallel_degree_limit_p1 => 0);
end;
/

---Validate Pending area for plan, consumer group and directives
begin
 dbms_resource_manager.validate_pending_area();
end;
/

---submit pending area for plan, consumer group and directives
begin
 dbms_resource_manager.submit_pending_area();
end;
/


--- Затем мы должны предоставить привилегии, чтобы назначить группы пользователей пользователям:
--- Нам нужно снова создать ожидающую область, пока мы не представим ожидающую область

---Create pending area for privilages, roles and assign users
begin
 dbms_resource_manager.create_pending_area();
end;
/

---4. Grant switch privilege for resource consumer groups to users or roles
begin
 dbms_resource_manager_privs.grant_switch_consumer_group(
   grantee_name => 'ADHOC',
   consumer_group => 'ADHOC_Group',
   grant_option => FALSE);
 dbms_resource_manager_privs.grant_switch_consumer_group(
   grantee_name => 'OLTP',
   consumer_group => 'OLTP_Group',
   grant_option => FALSE);
 dbms_resource_manager_privs.grant_switch_consumer_group(
   grantee_name => 'BATCH',
   consumer_group => 'BATCH_Group',
   grant_option => FALSE);
end;
/

---5. Assign users to resource consumer groups
begin
 dbms_resource_manager.set_initial_consumer_group(
  user => 'ADHOC',
  consumer_group => 'ADHOC_Group');
 dbms_resource_manager.set_initial_consumer_group(
  user => 'OLTP',
  consumer_group => 'OLTP_Group');
 dbms_resource_manager.set_initial_consumer_group(
  user => 'BATCH',
  consumer_group => 'BATCH_Group');
end;
/

---Validate Pending area for privilages, roles and assign users
begin
 dbms_resource_manager.validate_pending_area();
end;
/

---submit pending area for privilages, roles and assign users
begin
 dbms_resource_manager.submit_pending_area();
end;
/

Specify a plan to be used by the instance
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = MYDB_PLAN;


===================================================================================

Проверка диспетчера ресурсов конфигурации и мониторинга
Мы можем использовать динамические представления производительности,
чтобы помочь нам отслеживать результаты нашего Oracle Database Resource Manager

Resource Plans:

select plan, cpu_method, status from dba_rsrc_plans order by 1;

PLAN          CPU_METHOD  STATUS
------------- ----------- ---------
MYDB_PLAN     EMPHASIS    ACTIVE


Resource Consumer Groups:

select consumer_group,cpu_method, status from dba_rsrc_consumer_groups order by 1;

CONSUMER_GROUP CPU_METHOD STATUS
------------------------------ ------------------------------ ------------------------------
ADHOC_GROUP ROUND-ROBIN ACTIVE
BATCH_GROUP ROUND-ROBIN ACTIVE
DEFAULT_CONSUMER_GROUP ROUND-ROBIN ACTIVE
OLTP_GROUP ROUND-ROBIN ACTIVE
OTHER_GROUPS ROUND-ROBIN ACTIVE



Resource Plan Directives:

select plan, group_or_subplan, type, cpu_p1, cpu_p2, cpu_p3, cpu_p4, status
from dba_rsrc_plan_directives order by 1,2,3,4,5,6;

PLAN GROUP_OR_SUBPLAN TYPE CPU_P1 CPU_P2 CPU_P3 CPU_P4 STATUS
---------------------- -------------------- -------------- ---------- ---------- ---------- ---------- -------
MYDB_PLAN ADHOC_GROUP CONSUMER_GROUP 10 0 0 0 ACTIVE
MYDB_PLAN BATCH_GROUP CONSUMER_GROUP 10 0 0 0 ACTIVE
MYDB_PLAN OLTP_GROUP CONSUMER_GROUP 80 0 0 0 ACTIVE
MYDB_PLAN OTHER_GROUPS CONSUMER_GROUP 0 0 0 0 ACTIVE



Resource consumer group privileges:

select * from dba_rsrc_consumer_group_privs;

GRANTEE GRANTED_GROUP GRA INI
------------------------------ ------------------------------ --- ---
BATCH BATCH_GROUP NO YES
OLTP OLTP_GROUP NO YES
PUBLIC DEFAULT_CONSUMER_GROUP YES YES
ADHOC ADHOC_GROUP NO YES


Эти пользователи имеют право переключаться на группу потребителей, отличную от стандартной.

Группы пользователей по умолчанию для пользователей:

select username, initial_rsrc_consumer_group from dba_users;

USERNAME INITIAL_RSRC_CONSUMER_GROUP
------------------------------ ------------------------------
SYS DEFAULT_CONSUMER_GROUP
SYSTEM DEFAULT_CONSUMER_GROUP
OLTP OLTP_GROUP
ADHOC ADHOC_GROUP
OUTLN DEFAULT_CONSUMER_GROUP
DBSNMP DEFAULT_CONSUMER_GROUP
BATCH BATCH_GROUP



Мониторинг использования ЦП и ожиданий по группам потребителей:
В этом примере сервер имеет 16 процессоров, что означает, что максимум 16 сеансов могут выполняться в любое время.
См. Примечание 1338988.1


select to_char(m.begin_time, 'HH:MI') time,
       m.consumer_group_name,
       m.cpu_consumed_time / 60000 avg_running_sessions,
       m.cpu_wait_time / 60000 avg_waiting_sessions,
       d.mgmt_p1*(select value from v$parameter where name = 'cpu_count')/100 allocation
from v$rsrcmgrmetric_history m,
     dba_rsrc_plan_directives d,
     v$rsrc_plan p
where m.consumer_group_name = d.group_or_subplan
and p.name = d.plan
order by m.begin_time, m.consumer_group_name;

TIME NAME AVG_RUNNING AVG_WAITING ALLOCATION

----- ------------------ ----------- ----------- ----------
13:34 ADHOC_GROUP 1.76 8.4 .8
13:34 BATCH_GROUP 2.88 .4 2.4
13:34 ETL_GROUP 0 0 2.4
13:34 INTERACTIVE_GROUP 10.4 6.8 5.6
13:34 OTHER_GROUPS .32 .08 .8
13:34 SYS_GROUP 0 0 4


==========================================================================================================

Очистка плана менеджера ресурсов

Чтобы удалить текущий план, сначала его нужно «отключить», или другой план должен быть выбран как текущий.

alter system set resource_manager_plan='';

---Create pending area for delete plan and consumer group
begin
dbms_resource_manager.create_pending_area();
end;
/

--Delete plan (assuming we have created 2 plans - MYDB_PLAN, ANY_OTHER_CREATED_PLAN)
begin
 dbms_resource_manager.delete_plan(
   plan => 'MYDB_PLAN');
 dbms_resource_manager.delete_plan(
   plan => 'ANY_OTHER_CREATED_PLAN');
end;
/

--Delete consumer group
begin
 dbms_resource_manager.delete_consumer_group(
   consumer_group => 'OLTP_GROUP');
 dbms_resource_manager.delete_consumer_group(
   consumer_group => 'BATCH_GROUP');
 dbms_resource_manager.delete_consumer_group(
   consumer_group => 'ADHOC_GROUP');
end;
/

---Validate Pending area for delete plan and consumer group
begin
 dbms_resource_manager.validate_pending_area();
end;
/

---submit pending area for delete plan and consumer group
begin
 dbms_resource_manager.submit_pending_area();
end;
/

--Clearing only the Pending Area, if you dont want to validate and submit
BEGIN
 DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
END;
/


Ещё примеры:


BEGIN
  DBMS_RESOURCE_MANAGER.clear_pending_area;
  DBMS_RESOURCE_MANAGER.create_pending_area;

  -- Do something

  DBMS_RESOURCE_MANAGER.validate_pending_area;
  DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/


CONN sys/password AS SYSDBA
BEGIN
  DBMS_RESOURCE_MANAGER.clear_pending_area();
  DBMS_RESOURCE_MANAGER.create_pending_area();

  -- Create the consumer groups
  DBMS_RESOURCE_MANAGER.create_consumer_group(
    consumer_group => 'oltp_consumer_group',
    comment        => 'OLTP process consumer group.');

  DBMS_RESOURCE_MANAGER.create_consumer_group(
    consumer_group => 'batch_consumer_group',
    comment        => 'Batch process consumer group.');

  DBMS_RESOURCE_MANAGER.validate_pending_area();
  DBMS_RESOURCE_MANAGER.submit_pending_area();
END;
/



BEGIN
  DBMS_RESOURCE_MANAGER.clear_pending_area();
  DBMS_RESOURCE_MANAGER.create_pending_area();

  -- Delete consumer groups.
  DBMS_RESOURCE_MANAGER.delete_consumer_group (
    consumer_group => 'oltp_consumer_group');

  DBMS_RESOURCE_MANAGER.delete_consumer_group (
    consumer_group => 'batch_consumer_group');

  DBMS_RESOURCE_MANAGER.validate_pending_area();
  DBMS_RESOURCE_MANAGER.submit_pending_area();
END;
/



BEGIN
  DBMS_RESOURCE_MANAGER.clear_pending_area;
  DBMS_RESOURCE_MANAGER.create_pending_area;

  -- Create a new plan
  DBMS_RESOURCE_MANAGER.create_plan(
    plan    => 'day_plan',
    comment => 'Plan suitable for daytime processing.');

  -- Assign consumer groups to plan and define priorities
  DBMS_RESOURCE_MANAGER.create_plan_directive (
    plan             => 'day_plan',
    group_or_subplan => 'oltp_consumer_group',
     comment          => 'Give OLTP processes higher priority - level 1',
    cpu_p1           => 80,
    switch_group     => 'batch_consumer_group',
    switch_time      => 60);

  DBMS_RESOURCE_MANAGER.create_plan_directive (
    plan             => 'day_plan',
    group_or_subplan => 'batch_consumer_group',
    comment          => 'Give batch processes lower priority - level 2',
    cpu_p2           => 100);

  DBMS_RESOURCE_MANAGER.create_plan_directive (
    plan             => 'day_plan',
    group_or_subplan => 'OTHER_GROUPS',
    comment          => 'all other users - level 3',
    cpu_p3           => 100);

  DBMS_RESOURCE_MANAGER.validate_pending_area;
  DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/


BEGIN
  DBMS_RESOURCE_MANAGER.clear_pending_area;
  DBMS_RESOURCE_MANAGER.create_pending_area;

  -- Create a new plan
  DBMS_RESOURCE_MANAGER.create_plan(
    plan    => 'night_plan',
    comment => 'Plan suitable for daytime processing.');

  -- Assign consumer groups to plan and define priorities
  DBMS_RESOURCE_MANAGER.create_plan_directive (
    plan             => 'night_plan',
    group_or_subplan => 'batch_consumer_group',
    comment          => 'Give batch processes lower priority - level 2',
    cpu_p1           => 80);

  DBMS_RESOURCE_MANAGER.create_plan_directive (
    plan             => 'night_plan',
    group_or_subplan => 'oltp_consumer_group',
    comment          => 'Give OLTP processes higher priority - level 1',
    cpu_p2           => 100);

  DBMS_RESOURCE_MANAGER.create_plan_directive(
    plan             => 'night_plan',
    group_or_subplan => 'OTHER_GROUPS',
    comment          => 'all other users - level 3',
    cpu_p3           => 100);

  DBMS_RESOURCE_MANAGER.validate_pending_area;
  DBMS_RESOURCE_MANAGER.submit_pending_area;
END;
/




Ещё примеры:


WEB сервер подключается к БД под одним пользователем:
TEST_USER

-- Создаём ресурсные группы:
-- TEST_HIGH_GROUP
-- TEST_MEDIUM_GROUP
-- TEST_LOW_GROUP


begin
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();

  dbms_resource_manager.create_consumer_group(
      consumer_group => 'TEST_HIGH_GROUP',
      comment        => 'All TEST sessions start in this group.');
  dbms_resource_manager.create_consumer_group(
      consumer_group => 'TEST_MEDIUM_GROUP',
      comment        => 'TEST sessions are switched to this group after 10 seconds.');     
  dbms_resource_manager.create_consumer_group(
      consumer_group => 'TEST_LOW_GROUP',
      comment        => 'Any sessions in this group have been executing for more than 120 seconds');
    
  dbms_resource_manager.submit_pending_area();

end;
/


-- Дадим возможность пользователю  TEST_USER
-- переключаться между группами:
-- TEST_HIGH_GROUP
-- TEST_MEDIUM_GROUP
-- TEST_LOW_GROUP

  
begin
    dbms_resource_manager_privs.grant_switch_consumer_group (
        grantee_name => 'TEST_USER',
        consumer_group => 'TEST_HIGH_GROUP',
        grant_option => FALSE );
    dbms_resource_manager_privs.grant_switch_consumer_group (
        grantee_name => 'TEST_USER',
        consumer_group => 'TEST_MEDIUM_GROUP',
        grant_option => FALSE );
    dbms_resource_manager_privs.grant_switch_consumer_group (
        grantee_name => 'TEST_USER',
        consumer_group => 'TEST_LOW_GROUP',
        grant_option => FALSE );
end;
/


begin

  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();

-- Создаём план ресурсов

  dbms_resource_manager.create_plan( plan => 'TEST_PLAN', comment => 'TEST Plan');



--   Создаём директивы для нашего плана ресурсов
--   Сеанс, находясь в группах, получает ресурсы:
--   TEST_HIGH_GROUP    70%  CPU
--   TEST_MEDIUM_GROUP  8 %  CPU
--   TEST_LOW_GROUP     2 %  CPU



  -- Если вызов SQL выполняется более 10 секунд на CPU,
  -- то переключаемся на группу TEST_MEDIUM_GROUP

  dbms_resource_manager.create_plan_directive(
      plan => 'TEST_PLAN',
      group_or_subplan => 'TEST_HIGH_GROUP',
      comment => 'All TEST sessions start in this group.',
      mgmt_p1 => 70,
      switch_group => 'TEST_MEDIUM_GROUP',
      switch_time => 10,
      switch_for_call => TRUE,
      switch_estimate => FALSE );


  -- Если вызов SQL выполняется более 120 секунд на CPU,
  -- то переключаемся на группу TEST_LOW_GROUP


  dbms_resource_manager.create_plan_directive(
      plan => 'TEST_PLAN',
      group_or_subplan => 'TEST_MEDIUM_GROUP',
      comment => 'TEST sessions are switched to this group after 10 seconds.',
      mgmt_p1 => 8,
      switch_group => 'TEST_LOW_GROUP',
      switch_time => 120,
      switch_for_call => TRUE,
      switch_estimate => FALSE );


  -- Если вызов SQL выполняется более 1800 секунд на CPU,
  -- то сеанс не будет прерван, но вызов SQL будет отменён

   
  dbms_resource_manager.create_plan_directive(
      plan=> 'TEST_PLAN',
      group_or_subplan => 'TEST_LOW_GROUP',
      comment => 'Any sessions in this group have been executing for more than 120 seconds',
      mgmt_p1 => 2,
      switch_group => 'CANCEL_SQL',
      switch_time => 1800,
      switch_for_call => TRUE,
      switch_estimate => FALSE );
    

  -- Создадим директивы для двух предопределённых групп
  -- OTHER_GROUPS
  -- ORA$AUTOTASK_SUB_PLAN
  -- И выделим им по 10% ресурсов CPU


  dbms_resource_manager.create_plan_directive(
      plan=> 'TEST_PLAN',
      group_or_subplan => 'OTHER_GROUPS',
      comment => 'The mandatory group',
      mgmt_p1 => 10
  );
    
  dbms_resource_manager.create_plan_directive(
      plan=> 'TEST_PLAN',
      group_or_subplan => 'ORA$AUTOTASK_SUB_PLAN',
      comment => 'Sub plan for maintenance activity',
      mgmt_p1 => 10
  );


    
  -- Установим группу TEST_HIGH_GROUP, 
  -- группой по умолчанию для пользователя TEST_USER
  dbms_resource_manager.set_initial_consumer_group(
      user => 'TEST_USER',
      consumer_group => 'TEST_HIGH_GROUP');

  dbms_resource_manager.submit_pending_area();

end;
/




-- Во время окон обслуживания активируется план DEFAULT_MAINTENANCE_PLAN
-- Мы хотим чтобы и во время окон обслуживания активировался наш план TEST_PLAN


begin

dbms_scheduler.set_attribute(
  name => 'MONDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
 name => 'TUESDAY_WINDOW',
 attribute => 'RESOURCE_PLAN',
 value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
  name => 'WEDNESDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
  name => 'THURSDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
  name => 'FRIDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
  name => 'SATURDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

dbms_scheduler.set_attribute(
  name => 'SUNDAY_WINDOW',
  attribute => 'RESOURCE_PLAN',
  value => 'TEST_PLAN'
);

end;
/


Активируем наш план  TEST_PLAN  на уровне экземпляра:
alter system set resource_manager_plan = 'TEST_PLAN' scope=both;



Представления:

select * from dba_rsrc_plans;
select * from dba_rsrc_plan_directives;
select * from dba_rsrc_consumer_groups;
select * from dba_rsrc_consumer_group_privs;
select * from dba_rsrc_mapping_priority;
select * from dba_rsrc_group_mappings;
select * from dba_rsrc_manager_system_privs;
select initial_rsrc_consumer_group from dba_users;
select resource_consumer_group, current_queue_duration from v$session;
select * from v$rsrc_plan;
select * from v$rsrc_consumer_group;

select * from dba_scheduler_wingroup_members;
select * from dba_scheduler_windows;
select * from dba_scheduler_window_groups;
select * from dba_autotask_client;
select * from dba_autotask_client_history;
select * from dba_autotask_job_history;
select * from DBA_AUTOTASK_CLIENT_JOB;
select * from dba_autotask_operation;
select * from dba_autotask_task;
select * from DBA_AUTOTASK_WINDOW_CLIENTS;
select * from DBA_AUTOTASK_WINDOW_HISTORY;
select * from DBA_AUTOTASK_SCHEDULE;