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
вторник, 7 апреля 2009 г.
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
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
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
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
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
Installation of these packages generated errors:
Installation of <1> packages was skipped.
The file
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.
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;
Подписаться на:
Сообщения (Atom)