def create_user(): if dconf.DB_TYPE == 'postgres': sql = "CREATE USER {} SUPERUSER PASSWORD '{}';".format( dconf.DB_USER, dconf.DB_PASSWORD) run("PGPASSWORD={} psql -c \\\"{}\\\" -U postgres -h {}".format( dconf.DB_PASSWORD, sql, dconf.DB_HOST)) elif dconf.DB_TYPE == 'oracle': run_sql_script('createUser.sh', dconf.DB_USER, dconf.DB_PASSWORD) else: raise Exception("Database Type {} Not Implemented !".format( dconf.DB_TYPE))
def restart_database(): if dconf.DB_TYPE == 'postgres': if dconf.HOST_CONN == 'docker': # Restarting the docker container here is the cleanest way to do it # becaues there's no init system running and the only process running # in the container is postgres itself local('docker restart {}'.format(dconf.CONTAINER_NAME)) elif dconf.HOST_CONN == 'remote_docker': run('docker restart {}'.format(dconf.CONTAINER_NAME), remote_only=True) else: sudo('pg_ctl -D {} -w -t 600 restart -m fast'.format( dconf.PG_DATADIR), user=dconf.ADMIN_USER, capture=False) elif dconf.DB_TYPE == 'mysql': if dconf.HOST_CONN == 'docker': local('docker restart {}'.format(dconf.CONTAINER_NAME)) elif dconf.HOST_CONN == 'remote_docker': run('docker restart {}'.format(dconf.CONTAINER_NAME), remote_only=True) else: sudo('service mysql restart') elif dconf.DB_TYPE == 'oracle': db_log_path = os.path.join( os.path.split(dconf.DB_CONF)[0], 'startup.log') local_log_path = os.path.join(dconf.LOG_DIR, 'startup.log') local_logs_path = os.path.join(dconf.LOG_DIR, 'startups.log') run_sql_script('restartOracle.sh', db_log_path) get(db_log_path, local_log_path) with open(local_log_path, 'r') as fin, open(local_logs_path, 'a') as fout: lines = fin.readlines() for line in lines: if line.startswith('ORACLE instance started.'): return True if not line.startswith('SQL>'): fout.write(line) fout.write('\n') return False else: raise Exception("Database Type {} Not Implemented !".format( dconf.DB_TYPE)) return True
def restore_database(): dumpfile = os.path.join(dconf.DB_DUMP_DIR, dconf.DB_NAME + '.dump') if not dconf.ORACLE_FLASH_BACK and not file_exists(dumpfile): raise FileNotFoundError("Database dumpfile '{}' does not exist!".format(dumpfile)) LOG.info('Start restoring database') if dconf.DB_TYPE == 'oracle': if dconf.ORACLE_FLASH_BACK: run_sql_script('flashBack.sh', dconf.RESTORE_POINT) clean_recovery() else: drop_user() create_user() run_sql_script('restoreOracle.sh', dconf.DB_USER, dconf.DB_NAME) elif dconf.DB_TYPE == 'postgres': drop_database() create_database() run('PGPASSWORD={} pg_restore -U {} -h {} -n public -j 8 -F c -d {} {}'.format( dconf.DB_PASSWORD, dconf.DB_USER, dconf.DB_HOST, dconf.DB_NAME, dumpfile)) else: raise Exception("Database Type {} Not Implemented !".format(dconf.DB_TYPE)) LOG.info('Finish restoring database')
def dump_database(): dumpfile = os.path.join(dconf.DB_DUMP_DIR, dconf.DB_NAME + '.dump') if dconf.DB_TYPE == 'oracle': if not dconf.ORACLE_FLASH_BACK and file_exists(dumpfile): LOG.info('%s already exists ! ', dumpfile) return False else: if file_exists(dumpfile): LOG.info('%s already exists ! ', dumpfile) return False if dconf.DB_TYPE == 'oracle' and dconf.ORACLE_FLASH_BACK: LOG.info('create restore point %s for database %s in %s', dconf.RESTORE_POINT, dconf.DB_NAME, dconf.RECOVERY_FILE_DEST) else: LOG.info('Dump database %s to %s', dconf.DB_NAME, dumpfile) if dconf.DB_TYPE == 'oracle': if dconf.ORACLE_FLASH_BACK: run_sql_script('createRestore.sh', dconf.RESTORE_POINT, dconf.RECOVERY_FILE_DEST_SIZE, dconf.RECOVERY_FILE_DEST) else: run_sql_script('dumpOracle.sh', dconf.DB_USER, dconf.DB_PASSWORD, dconf.DB_NAME, dconf.DB_DUMP_DIR) elif dconf.DB_TYPE == 'postgres': run('PGPASSWORD={} pg_dump -U {} -h {} -F c -d {} > {}'.format( dconf.DB_PASSWORD, dconf.DB_USER, dconf.DB_HOST, dconf.DB_NAME, dumpfile)) elif dconf.DB_TYPE == 'mysql': sudo('mysqldump --user={} --password={} --databases {} > {}'.format( dconf.DB_USER, dconf.DB_PASSWORD, dconf.DB_NAME, dumpfile)) else: raise Exception("Database Type {} Not Implemented !".format( dconf.DB_TYPE)) return True
def clean_recovery(): run_sql_script('removeRestore.sh', dconf.RESTORE_POINT) cmds = ("""rman TARGET / <<EOF\nDELETE ARCHIVELOG ALL;\nexit\nEOF""") run(cmds)