示例#1
0
    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
示例#2
0
    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
示例#3
0
 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
示例#4
0
 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
示例#5
0
    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)
示例#6
0
    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
示例#7
0
 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