def get_master_ref(self, service, snapshot_info): """Capture information from a master node""" pfile = '/tmp/init%s_stby.ora' % self._get_config().db_name pwfile = ('%(ora_home)s/dbs/orapw%(db_name)s' % { 'ora_home': CONF.get(MANAGER).oracle_home, 'db_name': self._get_config().db_name }) ctlfile = '/tmp/%s_stby.ctl' % self._get_config().db_name oratabfile = '/etc/oratab' oracnffile = CONF.get(MANAGER).conf_file datafile = '/tmp/oradata.tar.gz' def _cleanup_tmp_files(): operating_system.remove(ctlfile, force=True, as_root=True) operating_system.remove(pfile, force=True, as_root=True) operating_system.remove(datafile, force=True, as_root=True) _cleanup_tmp_files() with ora_service.LocalOracleClient(self._get_config().db_name, service=True) as client: client.execute("ALTER DATABASE CREATE STANDBY CONTROLFILE AS " "'%s'" % ctlfile) ora_service.OracleAdmin().create_parameter_file(target=pfile, client=client) q = sql_query.Query() q.columns = ["value"] q.tables = ["v$parameter"] q.where = ["name = 'fal_server'"] client.execute(str(q)) row = client.fetchone() db_list = [] if row is not None and row[0] is not None: db_list = str(row[0]).split(",") db_list.insert(0, self._get_config().db_name) # Create a tar file containing files needed for slave creation utils.execute_with_timeout('tar', '-Pczvf', datafile, ctlfile, pwfile, pfile, oratabfile, oracnffile, run_as_root=True, root_helper='sudo') oradata_encoded = operating_system.read_file( datafile, codec=stream_codecs.Base64Codec(), as_root=True, decode=False) _cleanup_tmp_files() master_ref = { 'host': netutils.get_my_ipv4(), 'db_name': self._get_config().db_name, 'db_list': db_list, 'oradata': oradata_encoded, } return master_ref
def list_users(self, limit=None, marker=None, include_marker=False): LOG.debug( "List all users for all the databases in an Oracle server instance." ) user_list = {} databases, marker = self.list_databases() for database in databases: oracle_db = models.OracleSchema.deserialize_schema(database) with LocalOracleClient(oracle_db.name, service=True) as client: q = sql_query.Query() q.columns = ["grantee"] q.tables = ["dba_role_privs"] q.where = [ "granted_role = '%s'" % CONF.get(MANAGER).cloud_user_role, "grantee != 'SYS'" ] client.execute(str(q)) for row in client: user_name = row[0] if user_name in user_list: user = models.OracleUser.deserialize_user( user_list.get(user_name)) else: user = models.OracleUser(user_name) user.databases = oracle_db.name user_list.update({user_name: user.serialize()}) return user_list.values(), marker
def estimate_backup_size(self): """Estimate the backup size. The estimation is 1/3 the total size of datafiles, which is a conservative figure derived from the Oracle RMAN backupset compression ratio.""" with oracle_service.LocalOracleClient(self.db_name, service=True) as client: q = sql_query.Query() q.columns = ["sum(bytes)"] q.tables = ["dba_data_files"] client.execute(str(q)) result = client.fetchall() return result[0][0] / 3
def get_parameter(self, parameter): """Get the value of the given intialization parameter.""" parameter = parameter.lower() LOG.debug('Getting current value of initialization parameter %s' % parameter) q = sql_query.Query(columns=['value'], tables=['v$parameter'], where=["name = '%s'" % parameter]) with LocalOracleClient(self.database_name, service=True) as client: client.execute(str(q)) value = client.fetchone()[0] LOG.debug('Found parameter %s = %s' % (parameter, value)) return value
def _truncate_backup_chain(self): """Truncate all backups in the backup chain after the specified parent backup.""" with LocalOracleClient(self.db_name, service=True) as client: max_recid = sql_query.Query() max_recid.columns = ["max(recid)"] max_recid.tables = ["v$backup_piece"] max_recid.where = ["handle like '%%%s%%'" % self.parent_id] q = sql_query.Query() q.columns = ["recid"] q.tables = ["v$backup_piece"] q.where = ["recid > (%s)" % str(max_recid)] client.execute(str(q)) delete_list = [str(row[0]) for row in client] if delete_list: cmd = ("""\"\ rman target %(admin_user)s/%(admin_pswd)s@localhost/%(db_name)s <<EOF run { delete force noprompt backupset %(delete_list)s; } EXIT; EOF\" """ % { 'admin_user': ADMIN_USER, 'admin_pswd': self.oracnf.admin_password, 'db_name': self.db_name, 'delete_list': ",".join(delete_list) }) utils.execute_with_timeout("su - oracle -c " + cmd, run_as_root=True, root_helper='sudo', timeout=LARGE_TIMEOUT, shell=True, log_output_on_error=True)
def _get_user(self, username, hostname): LOG.debug("Get details of a given database user %s." % username) user = models.OracleUser(username) databases, marker = self.list_databases() for database in databases: oracle_db = models.OracleSchema.deserialize_schema(database) with LocalOracleClient(oracle_db.name, service=True) as client: q = sql_query.Query() q.columns = ["username"] q.tables = ["all_users"] q.where = ["username = '******'" % username.upper()] client.execute(str(q)) users = client.fetchall() if client.rowcount == 1: user.databases.append(database) return user
def _database_is_up(self, dbname): try: with LocalOracleClient(dbname, service=True) as client: q = sql_query.Query() q.columns = ["ROLE"] q.tables = ["DBA_ROLES"] q.where = [ "ROLE = '%s'" % CONF.get(MANAGER).cloud_user_role.upper() ] client.execute(str(q)) client.fetchall() if client.rowcount == 1: return True else: return False except cx_Oracle.DatabaseError: return False