Merhaba arkadaşlar bu yazımda Data Guard kurulumunu anlatacagım.
Benim senaryoma göre ;
Birinci makineye Oracle Enterprise Linux 6.4 kurup onunda üzerine de Oracle 11gR2 yazılımı ve veritabanı kurulmuştur.Ve ben bu makineyi bundan sonra primary makine ismiyle anacagım.
İkinci makineye de aynı şekilde Oracle Enterprise Linux 6.4 kurulacagım bu aşamadan sonra ise buraya sadece Oracle 11gR2 yazılımını kuracagım.Bu makineyi de secondary ismiyle anacagım.
Yani benim canlı(production) veritabanım primary,ondan beslenen standby veritabanım da secondary olacak.
Primary
Secondary
Hostname
primary
secondary
IP
192.168.1.125
192.168.1.126
ORACLE_SID
ORCL
ORCLSTBY
ORACLE_UNQNAME
ORCL
ORCLSTBY
ORACLE_NAME
ORCL
ORCL
Data Guard kurulumu yapmanın birden fazla yöntemi vardır.Duplicate komutuyla kurulabilecegi gibi alınan rman backup ile de kurulumu yapabiliriz bunların yanı sıra 3. parti uygulamaları(dbvisit,12c cloud control,Broker vb.) kullanarak da kurulum yapabiliriz aslında bunlarda arka planda duplicate veya alınan backup’ı kullanma vb. işlemler yapıyor,bu 3.parti uygulamaların tek yararı kurulumu daha basite indirgemek. (continue reading…)
Nedir bu felaket kurtarma,bunu örneklerle açıklayacak olursak veritabanımızın bulunduğu ortamın bir şekilde zarar görmesi(yangın,deprem,sel vb.) sonucu sıfır veri kaybı veya çok az bir veri kaybı ile hızlı bir şekilde veritatabanımızı ayağa kaldırmamızı sağlar.Peki bunu nasıl sağlar ;Bunu da veritabanımızın bire bir kopya (replice)’ sını başka bir lokasyon da bekleterek sağlar.
Oracle standby kullanabilmek için Oracle’ın Enterprise sürümünü kullanıyor olmamız gerekir.Standby teknolojisi Oracle 7 ile manuel standby veritabanı oluştururarak kullanılmaya başlandı ve her versiyon da yeni özellikler getirildi. (continue reading…)
Merhaba arkadaşlar bu yazımda data subsetting ile ilgili bir örnek yapacagım ama subsetting yapmadan önce subsetting nedir kısaca bundan bahsedelim.
Bildigimiz gibi bir yazılım projesi yapılırken,yapılan proje hemen canlı sisteme uygulanmaz önce test ortamında denenmesi lazım test ortamından başarılı çıktıktan sonra ancak çalışan sisteme uygulanabilir.Peki test ortamında uygulanması için de bize veritabanı lazım çalışan veritabanımızı veremiyecegimize göre ne yaparız veritabanımızın aynısını bir başka tarafa kurmamız lazım fakat veritabanımızın boyutu çok yüksek ise bu bizim işimizi çok uzatır ve istenmeyen bir durum söz konusu olur işte subsetting tam olarak burada ortaya çıkıyor.Subsetting ile test veritabanımıza canlı veritabanımızdaki her şey gitmesin de bizim belirledigimiz şartlara göre bir miktar veri gitsin(Örnegin benim x tablomun %10 verisi karşı veritabanına gitsin gibi vs.).Yani kısaca özetleyecek olursak veri bütünlügünü ve yapısını bozmadan test veritabanı oluşturacagımız zaman subsetting çok işimize yarar.
Şimdi Oracle 12c Enterprise Manager Dan yararlanaraktan Subsetting ile ilgili bir örnek yapalım,yapacagımız adımları kısaca yazarsak ;
// Below we define constants with default values for all configuration
// parameters except username/password. All of them can have their
// defaults set through environment variables. The reason we use the
// PHP_ prefix is for some security, PHP protects environment
// variables starting with PHP_*.
// default channel and preferred mirror is based on whether we are invoked through
// the “pear” or the “pecl” command
if (!defined(‘PEAR_RUNTYPE’)) {
define(‘PEAR_RUNTYPE’, ‘pear’);
}
// Default for sig_keydir
if (getenv(‘PHP_PEAR_SIG_KEYDIR’)) {
define(‘PEAR_CONFIG_DEFAULT_SIG_KEYDIR’, getenv(‘PHP_PEAR_SIG_KEYDIR’));
} else {
define(‘PEAR_CONFIG_DEFAULT_SIG_KEYDIR’,
PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . ‘pearkeys’);
}
/**
* This is a class for storing configuration data, keeping track of
* which are system-defined, user-defined or defaulted.
* @category pear
* @package PEAR
* @author Stig Bakken
* @author Greg Beaver
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.10.12
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/
class PEAR_Config extends PEAR
{
/**
* Array of config files used.
*
* @var array layer => config file
*/
var $files = array(
‘system’ => ”,
‘user’ => ”,
);
var $layers = array();
/**
* Configuration data, two-dimensional array where the first
* dimension is the config layer (‘user’, ‘system’ and ‘default’),
* and the second dimension is keyname => value.
*
* The order in the first dimension is important! Earlier
* layers will shadow later ones when a config value is
* requested (if a ‘user’ value exists, it will be returned first,
* then ‘system’ and finally ‘default’).
*
* @var array layer => array(keyname => value, …)
*/
var $configuration = array(
‘user’ => array(),
‘system’ => array(),
‘default’ => array(),
);
/**
* Configuration values that can be set for a channel
*
* All other configuration values can only have a global value
* @var array
* @access private
*/
var $_channelConfigInfo = array(
‘php_dir’, ‘ext_dir’, ‘doc_dir’, ‘bin_dir’, ‘data_dir’, ‘cfg_dir’,
‘test_dir’, ‘www_dir’, ‘php_bin’, ‘php_prefix’, ‘php_suffix’, ‘username’,
‘password’, ‘verbose’, ‘preferred_state’, ‘umask’, ‘preferred_mirror’, ‘php_ini’
);
/**
* Channels that can be accessed
* @see setChannels()
* @var array
* @access private
*/
var $_channels = array(‘pear.php.net’, ‘pecl.php.net’, ‘__uri’);
/**
* This variable is used to control the directory values returned
* @see setInstallRoot();
* @var string|false
* @access private
*/
var $_installRoot = false;
/**
* If requested, this will always refer to the registry
* contained in php_dir
* @var PEAR_Registry
*/
var $_registry = array();
/**
* Static singleton method. If you want to keep only one instance
* of this class in use, this method will give you a reference to
* the last created PEAR_Config object if one exists, or create a
* new object.
*
* @param string (optional) file to read user-defined options from
* @param string (optional) file to read system-wide defaults from
*
* @return object an existing or new PEAR_Config instance
*
* @see PEAR_Config::PEAR_Config
*/
public static function &singleton($user_file = ”, $system_file = ”, $strict = true)
{
if (is_object($GLOBALS[‘_PEAR_Config_instance’])) {
return $GLOBALS[‘_PEAR_Config_instance’];
}
$t_conf = new PEAR_Config($user_file, $system_file, false, $strict);
if ($t_conf->_errorsFound > 0) {
return $t_conf->lastError;
}
/**
* Determine whether any configuration files have been detected, and whether a
* registry object can be retrieved from this configuration.
* @return bool
* @since PEAR 1.4.0a1
*/
function validConfiguration()
{
if ($this->isDefinedLayer(‘user’) || $this->isDefinedLayer(‘system’)) {
return true;
}
return false;
}
/**
* Reads configuration data from a file. All existing values in
* the config layer are discarded and replaced with data from the
* file.
* @param string file to read from, if NULL or not specified, the
* last-used file for the same layer (second param) is used
* @param string config layer to insert data into (‘user’ or ‘system’)
* @return bool TRUE on success or a PEAR error on failure
*/
function readConfigFile($file = null, $layer = ‘user’, $strict = true)
{
if (empty($this->files[$layer])) {
return $this->raiseError(“unknown config layer `$layer'”);
}
if ($file === null) {
$file = $this->files[$layer];
}
$data = $this->_readConfigDataFrom($file);
if (PEAR::isError($data)) {
if (!$strict) {
return true;
}
$fail = array();
foreach ($this->configuration_info as $key => $val) {
if (in_array($this->getGroup($key),
array(‘File Locations’, ‘File Locations (Advanced)’)) &&
$this->getType($key) == ‘directory’) {
// any directory configs must be set for this to work
if (!isset($this->configuration[‘ftp’][$key])) {
$fail[] = $key;
}
}
}
if (!count($fail)) {
return true;
}
$fail = ‘”‘ . implode(‘”, “‘, $fail) . ‘”‘;
unset($this->files[‘ftp’]);
unset($this->configuration[‘ftp’]);
return PEAR::raiseError(‘ERROR: Ftp configuration file must set all ‘ .
‘directory configuration variables. These variables were not set: ‘ .
$fail);
} while (false); // poor man’s catch
unset($this->files[‘ftp’]);
return PEAR::raiseError(‘no remote host specified’);
}
/**
* Reads the existing configurations and creates the _channels array from it
*/
function _setupChannels()
{
$set = array_flip(array_values($this->_channels));
foreach ($this->configuration as $layer => $data) {
$i = 1000;
if (isset($data[‘__channels’]) && is_array($data[‘__channels’])) {
foreach ($data[‘__channels’] as $channel => $info) {
$set[$channel] = $i++;
}
}
}
$this->_channels = array_values(array_flip($set));
$this->setChannels($this->_channels);
}
function deleteChannel($channel)
{
$ch = strtolower($channel);
foreach ($this->configuration as $layer => $data) {
if (isset($data[‘__channels’]) && isset($data[‘__channels’][$ch])) {
unset($this->configuration[$layer][‘__channels’][$ch]);
}
}
/**
* Merges data into a config layer from a file. Does the same
* thing as readConfigFile, except it does not replace all
* existing values in the config layer.
* @param string file to read from
* @param bool whether to overwrite existing data (default TRUE)
* @param string config layer to insert data into (‘user’ or ‘system’)
* @param string if true, errors are returned if file opening fails
* @return bool TRUE on success or a PEAR error on failure
*/
function mergeConfigFile($file, $override = true, $layer = ‘user’, $strict = true)
{
if (empty($this->files[$layer])) {
return $this->raiseError(“unknown config layer `$layer'”);
}
if ($file === null) {
$file = $this->files[$layer];
}
$data = $this->_readConfigDataFrom($file);
if (PEAR::isError($data)) {
if (!$strict) {
return true;
}
/**
* @param array
* @param array
* @return array
*/
public static function arrayMergeRecursive($arr2, $arr1)
{
$ret = array();
foreach ($arr2 as $key => $data) {
if (!isset($arr1[$key])) {
$ret[$key] = $data;
unset($arr1[$key]);
continue;
}
if (is_array($data)) {
if (!is_array($arr1[$key])) {
$ret[$key] = $arr1[$key];
unset($arr1[$key]);
continue;
}
$ret[$key] = PEAR_Config::arrayMergeRecursive($arr1[$key], $arr2[$key]);
unset($arr1[$key]);
}
}
return array_merge($ret, $arr1);
}
/**
* Writes data into a config layer from a file.
*
* @param string|null file to read from, or null for default
* @param string config layer to insert data into (‘user’ or
* ‘system’)
* @param string|null data to write to config file or null for internal data [DEPRECATED]
* @return bool TRUE on success or a PEAR error on failure
*/
function writeConfigFile($file = null, $layer = ‘user’, $data = null)
{
$this->_lazyChannelSetup($layer);
if ($layer == ‘both’ || $layer == ‘all’) {
foreach ($this->files as $type => $file) {
$err = $this->writeConfigFile($file, $type, $data);
if (PEAR::isError($err)) {
return $err;
}
}
return true;
}
if (empty($this->files[$layer])) {
return $this->raiseError(“unknown config file type `$layer'”);
}
if ($file === null) {
$file = $this->files[$layer];
}
/**
* Reads configuration data from a file and returns the parsed data
* in an array.
*
* @param string file to read from
* @return array configuration data or a PEAR error on failure
* @access private
*/
function _readConfigDataFrom($file)
{
$fp = false;
if (file_exists($file)) {
$fp = @fopen($file, “r”);
}
if (!$fp) {
return $this->raiseError(“PEAR_Config::readConfigFile fopen(‘$file’,’r’) failed”);
}
if ($version && version_compare(“$version”, ‘1’, ‘<')) {
// no '@', it is possible that unserialize
// raises a notice but it seems to block IO to
// STDOUT if a '@' is used and a notice is raise
$data = unserialize($contents);
if (!is_array($data) && !$data) {
if ($contents == serialize(false)) {
$data = array();
} else {
$err = $this->raiseError(“PEAR_Config: bad data in $file”);
return $err;
}
}
if (!is_array($data)) {
if (strlen(trim($contents)) > 0) {
$error = “PEAR_Config: bad data in $file”;
$err = $this->raiseError($error);
return $err;
}
/**
* Gets the file used for storing the config for a layer
*
* @param string $layer ‘user’ or ‘system’
*/
function getConfFile($layer)
{
return $this->files[$layer];
}
/**
* @param string Configuration class name, used for detecting duplicate calls
* @param array information on a role as parsed from its xml file
* @return true|PEAR_Error
* @access private
*/
function _addConfigVars($class, $vars)
{
static $called = array();
if (isset($called[$class])) {
return;
}
$called[$class] = 1;
if (count($vars) > 3) {
return $this->raiseError(‘Roles can only define 3 new config variables or less’);
}
foreach ($vars as $name => $var) {
if (!is_array($var)) {
return $this->raiseError(‘Configuration information must be an array’);
}
if (!isset($var[‘type’])) {
return $this->raiseError(‘Configuration information must contain a type’);
} elseif (!in_array($var[‘type’],
array(‘string’, ‘mask’, ‘password’, ‘directory’, ‘file’, ‘set’))) {
return $this->raiseError(
‘Configuration type must be one of directory, file, string, ‘ .
‘mask, set, or password’);
}
if (!isset($var[‘default’])) {
return $this->raiseError(
‘Configuration information must contain a default value (“default” index)’);
}
if (is_array($var[‘default’])) {
$real_default = ”;
foreach ($var[‘default’] as $config_var => $val) {
if (strpos($config_var, ‘text’) === 0) {
$real_default .= $val;
} elseif (strpos($config_var, ‘constant’) === 0) {
if (!defined($val)) {
return $this->raiseError(
‘Unknown constant “‘ . $val . ‘” requested in ‘ .
‘default value for configuration variable “‘ .
$name . ‘”‘);
}
$real_default .= constant($val);
} elseif (isset($this->configuration_info[$config_var])) {
$real_default .=
$this->configuration_info[$config_var][‘default’];
} else {
return $this->raiseError(
‘Unknown request for “‘ . $config_var . ‘” value in ‘ .
‘default value for configuration variable “‘ .
$name . ‘”‘);
}
}
$var[‘default’] = $real_default;
}
if ($var[‘type’] == ‘integer’) {
$var[‘default’] = (integer) $var[‘default’];
}
if (!isset($var[‘doc’])) {
return $this->raiseError(
‘Configuration information must contain a summary (“doc” index)’);
}
if (!isset($var[‘prompt’])) {
return $this->raiseError(
‘Configuration information must contain a simple prompt (“prompt” index)’);
}
if (!isset($var[‘group’])) {
return $this->raiseError(
‘Configuration information must contain a simple group (“group” index)’);
}
$this->configuration_info[$name] = $var;
// fix bug #7351: setting custom config variable in a channel fails
$this->_channelConfigInfo[] = $name;
}
return true;
}
/**
* Encodes/scrambles configuration data before writing to files.
* Currently, ‘password’ values will be base64-encoded as to avoid
* that people spot cleartext passwords by accident.
*
* @param array (reference) array to encode values in
* @return bool TRUE on success
* @access private
*/
function _encodeOutput(&$data)
{
foreach ($data as $key => $value) {
if ($key == ‘__channels’) {
foreach ($data[‘__channels’] as $channel => $blah) {
$this->_encodeOutput($data[‘__channels’][$channel]);
}
}
if (!isset($this->configuration_info[$key])) {
continue;
}
$type = $this->configuration_info[$key][‘type’];
switch ($type) {
// we base64-encode passwords so they are at least
// not shown in plain by accident
case ‘password’: {
$data[$key] = base64_encode($data[$key]);
break;
}
case ‘mask’: {
$data[$key] = octdec($data[$key]);
break;
}
}
}
return true;
}
/**
* Decodes/unscrambles configuration data after reading from files.
*
* @param array (reference) array to encode values in
* @return bool TRUE on success
* @access private
*
* @see PEAR_Config::_encodeOutput
*/
function _decodeInput(&$data)
{
if (!is_array($data)) {
return true;
}
foreach ($data as $key => $value) {
if ($key == ‘__channels’) {
foreach ($data[‘__channels’] as $channel => $blah) {
$this->_decodeInput($data[‘__channels’][$channel]);
}
}
if (!isset($this->configuration_info[$key])) {
continue;
}
/**
* Retrieve the default channel.
*
* On startup, channels are not initialized, so if the default channel is not
* pear.php.net, then initialize the config.
* @param string registry layer
* @return string|false
*/
function getDefaultChannel($layer = null)
{
$ret = false;
if ($layer === null) {
foreach ($this->layers as $layer) {
if (isset($this->configuration[$layer][‘default_channel’])) {
$ret = $this->configuration[$layer][‘default_channel’];
break;
}
}
} elseif (isset($this->configuration[$layer][‘default_channel’])) {
$ret = $this->configuration[$layer][‘default_channel’];
}
if ($ret) {
if ($ret != ‘pear.php.net’) {
$this->_lazyChannelSetup();
}
return $ret;
}
return PEAR_CONFIG_DEFAULT_CHANNEL;
}
/**
* Returns a configuration value, prioritizing layers as per the
* layers property.
*
* @param string config key
* @return mixed the config value, or NULL if not found
* @access public
*/
function get($key, $layer = null, $channel = false)
{
if (!isset($this->configuration_info[$key])) {
return null;
}
if ($key == ‘__channels’) {
return null;
}
if ($key == ‘default_channel’) {
return $this->getDefaultChannel($layer);
}
if ($layer === null) {
foreach ($this->layers as $layer) {
if (isset($this->configuration[$layer][$key])) {
$test = $this->configuration[$layer][$key];
if ($this->_installRoot) {
if (in_array($this->getGroup($key),
array(‘File Locations’, ‘File Locations (Advanced)’)) &&
$this->getType($key) == ‘directory’) {
return $this->_prependPath($test, $this->_installRoot);
}
}
if ($key == ‘preferred_mirror’) {
$reg = &$this->getRegistry();
if (is_object($reg)) {
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $channel;
}
if (!$chan->getMirror($test) && $chan->getName() != $test) {
return $channel; // mirror does not exist
}
}
}
return $test;
}
}
} elseif (isset($this->configuration[$layer][$key])) {
$test = $this->configuration[$layer][$key];
if ($this->_installRoot) {
if (in_array($this->getGroup($key),
array(‘File Locations’, ‘File Locations (Advanced)’)) &&
$this->getType($key) == ‘directory’) {
return $this->_prependPath($test, $this->_installRoot);
}
}
if ($key == ‘preferred_mirror’) {
$reg = &$this->getRegistry();
if (is_object($reg)) {
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $channel;
}
if (!$chan->getMirror($test) && $chan->getName() != $test) {
return $channel; // mirror does not exist
}
}
}
return $test;
}
return null;
}
/**
* Returns a channel-specific configuration value, prioritizing layers as per the
* layers property.
*
* @param string config key
* @return mixed the config value, or NULL if not found
* @access private
*/
function _getChannelValue($key, $layer, $channel)
{
if ($key == ‘__channels’ || $channel == ‘pear.php.net’) {
return null;
}
$ret = null;
if ($layer === null) {
foreach ($this->layers as $ilayer) {
if (isset($this->configuration[$ilayer][‘__channels’][$channel][$key])) {
$ret = $this->configuration[$ilayer][‘__channels’][$channel][$key];
break;
}
}
} elseif (isset($this->configuration[$layer][‘__channels’][$channel][$key])) {
$ret = $this->configuration[$layer][‘__channels’][$channel][$key];
}
if ($key != ‘preferred_mirror’) {
return $ret;
}
if ($ret !== null) {
$reg = &$this->getRegistry($layer);
if (is_object($reg)) {
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $channel;
}
if (!$chan->getMirror($ret) && $chan->getName() != $ret) {
return $channel; // mirror does not exist
}
}
return $ret;
}
if ($channel != $this->getDefaultChannel($layer)) {
return $channel; // we must use the channel name as the preferred mirror
// if the user has not chosen an alternate
}
return $this->getDefaultChannel($layer);
}
/**
* Set a config value in a specific layer (defaults to ‘user’).
* Enforces the types defined in the configuration_info array. An
* integer config variable will be cast to int, and a set config
* variable will be validated against its legal values.
*
* @param string config key
* @param string config value
* @param string (optional) config layer
* @param string channel to set this value for, or null for global value
* @return bool TRUE on success, FALSE on failure
*/
function set($key, $value, $layer = ‘user’, $channel = false)
{
if ($key == ‘__channels’) {
return false;
}
if (!isset($this->configuration[$layer])) {
return false;
}
if ($key == ‘default_channel’) {
// can only set this value globally
$channel = ‘pear.php.net’;
if ($value != ‘pear.php.net’) {
$this->_lazyChannelSetup($layer);
}
}
if ($key == ‘preferred_mirror’) {
if ($channel == ‘__uri’) {
return false; // can’t set the __uri pseudo-channel’s mirror
}
$reg = &$this->getRegistry($layer);
if (is_object($reg)) {
$chan = $reg->getChannel($channel ? $channel : ‘pear.php.net’);
if (PEAR::isError($chan)) {
return false;
}
if (!$chan->getMirror($value) && $chan->getName() != $value) {
return false; // mirror does not exist
}
}
}
if (!isset($this->configuration_info[$key])) {
return false;
}
extract($this->configuration_info[$key]);
switch ($type) {
case ‘integer’:
$value = (int)$value;
break;
case ‘set’: {
// If a valid_set is specified, require the value to
// be in the set. If there is no valid_set, accept
// any value.
if ($valid_set) {
reset($valid_set);
if ((key($valid_set) === 0 && !in_array($value, $valid_set)) ||
(key($valid_set) !== 0 && empty($valid_set[$value])))
{
return false;
}
}
break;
}
}
if (!$channel) {
$channel = $this->get(‘default_channel’, null, ‘pear.php.net’);
}
if (!in_array($channel, $this->_channels)) {
$this->_lazyChannelSetup($layer);
$reg = &$this->getRegistry($layer);
if ($reg) {
$channel = $reg->channelName($channel);
}
if (!in_array($channel, $this->_channels)) {
return false;
}
}
if ($channel != ‘pear.php.net’) {
if (in_array($key, $this->_channelConfigInfo)) {
$this->configuration[$layer][‘__channels’][$channel][$key] = $value;
return true;
}
return false;
}
if ($key == ‘default_channel’) {
if (!isset($reg)) {
$reg = &$this->getRegistry($layer);
if (!$reg) {
$reg = &$this->getRegistry();
}
}
if ($reg) {
$value = $reg->channelName($value);
}
if (!$value) {
return false;
}
}
$this->configuration[$layer][$key] = $value;
if ($key == ‘php_dir’ && !$this->_noRegistry) {
if (!isset($this->_registry[$layer]) ||
$value != $this->_registry[$layer]->install_dir) {
$this->_registry[$layer] = new PEAR_Registry($value);
$this->_regInitialized[$layer] = false;
$this->_registry[$layer]->setConfig($this, false);
}
}
return true;
}
function _lazyChannelSetup($uselayer = false)
{
if ($this->_noRegistry) {
return;
}
$merge = false;
foreach ($this->_registry as $layer => $p) {
if ($uselayer && $uselayer != $layer) {
continue;
}
if (!$this->_regInitialized[$layer]) {
if ($layer == ‘default’ && isset($this->_registry[‘user’]) ||
isset($this->_registry[‘system’])) {
// only use the default registry if there are no alternatives
continue;
}
/**
* Set the list of channels.
*
* This should be set via a call to {@link PEAR_Registry::listChannels()}
* @param array
* @param bool
* @return bool success of operation
*/
function setChannels($channels, $merge = false)
{
if (!is_array($channels)) {
return false;
}
foreach ($channels as $channel) {
$channel = strtolower($channel);
if ($channel == ‘pear.php.net’) {
continue;
}
foreach ($this->layers as $layer) {
if (!isset($this->configuration[$layer][‘__channels’])) {
$this->configuration[$layer][‘__channels’] = array();
}
if (!isset($this->configuration[$layer][‘__channels’][$channel])
|| !is_array($this->configuration[$layer][‘__channels’][$channel])) {
$this->configuration[$layer][‘__channels’][$channel] = array();
}
}
}
return true;
}
/**
* Get the type of a config value.
*
* @param string config key
*
* @return string type, one of “string”, “integer”, “file”,
* “directory”, “set” or “password”.
*
* @access public
*
*/
function getType($key)
{
if (isset($this->configuration_info[$key])) {
return $this->configuration_info[$key][‘type’];
}
return false;
}
/**
* Get the documentation for a config value.
*
* @param string config key
* @return string documentation string
*
* @access public
*
*/
function getDocs($key)
{
if (isset($this->configuration_info[$key])) {
return $this->configuration_info[$key][‘doc’];
}
return false;
}
/**
* Get the short documentation for a config value.
*
* @param string config key
* @return string short documentation string
*
* @access public
*
*/
function getPrompt($key)
{
if (isset($this->configuration_info[$key])) {
return $this->configuration_info[$key][‘prompt’];
}
return false;
}
/**
* Get the parameter group for a config key.
*
* @param string config key
* @return string parameter group
*
* @access public
*
*/
function getGroup($key)
{
if (isset($this->configuration_info[$key])) {
return $this->configuration_info[$key][‘group’];
}
return false;
}
/**
* Get the list of parameter groups.
*
* @return array list of parameter groups
*
* @access public
*
*/
function getGroups()
{
$tmp = array();
foreach ($this->configuration_info as $key => $info) {
$tmp[$info[‘group’]] = 1;
}
return array_keys($tmp);
}
/**
* Get the list of the parameters in a group.
*
* @param string $group parameter group
* @return array list of parameters in $group
*
* @access public
*
*/
function getGroupKeys($group)
{
$keys = array();
foreach ($this->configuration_info as $key => $info) {
if ($info[‘group’] == $group) {
$keys[] = $key;
}
}
return $keys;
}
/**
* Get the list of allowed set values for a config value. Returns
* NULL for config values that are not sets.
*
* @param string config key
* @return array enumerated array of set values, or NULL if the
* config key is unknown or not a set
*
* @access public
*
*/
function getSetValues($key)
{
if (isset($this->configuration_info[$key]) &&
isset($this->configuration_info[$key][‘type’]) &&
$this->configuration_info[$key][‘type’] == ‘set’)
{
$valid_set = $this->configuration_info[$key][‘valid_set’];
reset($valid_set);
if (key($valid_set) === 0) {
return $valid_set;
}
return array_keys($valid_set);
}
return null;
}
/**
* Get all the current config keys.
*
* @return array simple array of config keys
*
* @access public
*/
function getKeys()
{
$keys = array();
foreach ($this->layers as $layer) {
$test = $this->configuration[$layer];
if (isset($test[‘__channels’])) {
foreach ($test[‘__channels’] as $channel => $configs) {
$keys = array_merge($keys, $configs);
}
}
/**
* Remove the a config key from a specific config layer.
*
* @param string config key
* @param string (optional) config layer
* @param string (optional) channel (defaults to default channel)
* @return bool TRUE on success, FALSE on failure
*
* @access public
*/
function remove($key, $layer = ‘user’, $channel = null)
{
if ($channel === null) {
$channel = $this->getDefaultChannel();
}
if ($channel !== ‘pear.php.net’) {
if (isset($this->configuration[$layer][‘__channels’][$channel][$key])) {
unset($this->configuration[$layer][‘__channels’][$channel][$key]);
return true;
}
}
if (isset($this->configuration[$layer][$key])) {
unset($this->configuration[$layer][$key]);
return true;
}
return false;
}
/**
* Temporarily remove an entire config layer. USE WITH CARE!
*
* @param string config key
* @param string (optional) config layer
* @return bool TRUE on success, FALSE on failure
*
* @access public
*/
function removeLayer($layer)
{
if (isset($this->configuration[$layer])) {
$this->configuration[$layer] = array();
return true;
}
return false;
}
/**
* Stores configuration data in a layer.
*
* @param string config layer to store
* @return bool TRUE on success, or PEAR error on failure
*
* @access public
*/
function store($layer = ‘user’, $data = null)
{
return $this->writeConfigFile(null, $layer, $data);
}
/**
* Tells what config layer that gets to define a key.
*
* @param string config key
* @param boolean return the defining channel
*
* @return string|array the config layer, or an empty string if not found.
*
* if $returnchannel, the return is an array array(‘layer’ => layername,
* ‘channel’ => channelname), or an empty string if not found
*
* @access public
*/
function definedBy($key, $returnchannel = false)
{
foreach ($this->layers as $layer) {
$channel = $this->getDefaultChannel();
if ($channel !== ‘pear.php.net’) {
if (isset($this->configuration[$layer][‘__channels’][$channel][$key])) {
if ($returnchannel) {
return array(‘layer’ => $layer, ‘channel’ => $channel);
}
return $layer;
}
}
if (isset($this->configuration[$layer][$key])) {
if ($returnchannel) {
return array(‘layer’ => $layer, ‘channel’ => ‘pear.php.net’);
}
return $layer;
}
}
return ”;
}
/**
* Tells whether a given key exists as a config value.
*
* @param string config key
* @return bool whether exists in this object
*
* @access public
*/
function isDefined($key)
{
foreach ($this->layers as $layer) {
if (isset($this->configuration[$layer][$key])) {
return true;
}
}
return false;
}
/**
* Tells whether a given config layer exists.
*
* @param string config layer
* @return bool whether exists in this object
*
* @access public
*/
function isDefinedLayer($layer)
{
return isset($this->configuration[$layer]);
}
/**
* Returns the layers defined (except the ‘default’ one)
*
* @return array of the defined layers
*/
function getLayers()
{
$cf = $this->configuration;
unset($cf[‘default’]);
return array_keys($cf);
}
// only go here if null was passed in
echo “CRITICAL ERROR: Registry could not be initialized from any value”;
exit(1);
}
/**
* This is to allow customization like the use of installroot
* @param PEAR_Registry
* @return bool
*/
function setRegistry(&$reg, $layer = ‘user’)
{
if ($this->_noRegistry) {
return false;
}
if (!in_array($layer, array(‘user’, ‘system’))) {
return false;
}
$this->_registry[$layer] = &$reg;
if (is_object($reg)) {
$this->_registry[$layer]->setConfig($this, false);
}
return true;
}
function noRegistry()
{
$this->_noRegistry = true;
}
$remote = new $class($this, $options);
return $remote;
}
/**
* The ftp server is set in {@link readFTPConfigFile()}. It exists only if a
* remote configuration file has been specified
* @return PEAR_FTP|false
*/
function &getFTP()
{
if (isset($this->_ftp)) {
return $this->_ftp;
}
Merhaba arkadaşlar Linux ortamında kurulu olan Oracle ile SqlPlus’ta çalışırken bir önceki yazdıgımız komutlara yukarı ok tuşuyla erişemememiz veya tab tuşunu kullanamamız çogu zaman eziyet haline gelebiliyor bu yazımda bunun çözümünden bahsedeceğim.
Öncelikle buradan rlwrap toolunu indiriyoruz.
Daha sonra oracle kullanıcısıyla aşagıdaki komutu kullanarak tool’u tar’dan çıkartırız.
tar -zxvf rlwrap-0.30.tar.gz
rlwrap-0.30 adında bir dosya çıkacakdır.Komut satırına cd rlwrap-0.30 yazarak dosyanın içine gireriz.
Daha sonra oracle kullanıcısıyla aşagıda ki komutu kullanarak dosyayı kurmasını saglarız ;