亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Openstack 使用migrate進行數據庫升級實現方案詳細介紹

2024-09-01 13:49:30
字體:
來源:轉載
供稿:網友

Openstack 使用migrate進行數據庫升級實現方案詳細介紹

OpenStack中隨著版本的切換,新版本加入一些數據庫表或者增加字段等是必然的事情,如何比較容易的進行這些數據庫升級的適配和管理,這里就要用到oslo_db中的migrate了,這里以為M版本的heat為例,講解一下migrate管理db的原理。

我們使用migrate需要用到的主要包含以下兩部分:1.versions里面的為版本號+數據庫適配腳本;2.migrate.cfg為migrate需要用到的配置文件,兩部分的命名是固定的。

Openstack,使用migrate進行數據庫升級,使用migrate進行數據庫升級怎么實現,migrate,數據庫升級

使用migrate進行數據庫升級非常簡單,heat這邊提供了heat-manage db_sync, db_version的命令用來升級db以及查看當前db的版本號,這里以執行heat-manages db_sync,看下migrate的過程。

def db_sync(engine, version=None):   path = os.path.join(os.path.abspath(os.path.dirname(__file__)),             'migrate_repo')   return oslo_migration.db_sync(engine, path, version,                  init_version=INIT_VERSION) 

heat代碼的入口在這里,需要傳入engine用來連接db,version為我們需要升級到的版本,這里沒有傳,可以看到heat這邊是直接使用oslo_migrate的db_sync方法,我們看下三方庫中的這個方法。

def db_sync(engine, abs_path, version=None, init_version=0, sanity_check=True):   """Upgrade or downgrade a database.    Function runs the upgrade() or downgrade() functions in change scripts.    :param engine:    SQLAlchemy engine instance for a given database   //連接數據庫   :param abs_path:   Absolute path to migrate repository.         //migrate倉庫的絕對路徑   :param version:   Database will upgrade/downgrade until this version. //需要升級或者降級到的版本號,如果不傳則默認升級到最新版本              If None - database will update to the latest              available version.   :param init_version: Initial database version               //數據庫的初始版本號,會以該初始版本為起點升級   :param sanity_check: Require schema sanity checking for all tables    //合理性檢查   """    if version is not None:     try:       version = int(version)     except ValueError:       raise exception.DBMigrationError(_("version should be an integer"))    current_version = db_version(engine, abs_path, init_version)   repository = _find_migrate_repo(abs_path)   if sanity_check:     _db_schema_sanity_check(engine)   if version is None or version > current_version:     migration = versioning_api.upgrade(engine, repository, version)   else:     migration = versioning_api.downgrade(engine, repository,                        version)   if sanity_check:     _db_schema_sanity_check(engine)    return migration 

代碼很清晰,簡潔??梢钥吹剑麄€過程就是先查詢下當前db的版本,然后聲明一個migrate倉庫示例,對db做合理性檢查(主要是針對mysql),然后根據傳入的version和當前的version決定是升級或者降低,最后再次檢查,整個migrate就完成了。

首先是查詢當前數據庫的版本,

def db_version(engine, abs_path, init_version):   """Show the current version of the repository.    :param engine: SQLAlchemy engine instance for a given database   :param abs_path: Absolute path to migrate repository   :param init_version: Initial database version   """   repository = _find_migrate_repo(abs_path)   try:     return versioning_api.db_version(engine, repository)   except versioning_exceptions.DatabaseNotControlledError:     meta = sqlalchemy.MetaData()     meta.reflect(bind=engine)     tables = meta.tables     if len(tables) == 0 or 'alembic_version' in tables:       db_version_control(engine, abs_path, version=init_version)       return versioning_api.db_version(engine, repository)     else:       raise exception.DBMigrationError(         _("The database is not under version control, but has "          "tables. Please stamp the current version of the schema "          "manually.")) 

首先是根據傳入的絕對路徑,構造一個倉庫對象的示例,這里比較關鍵,初始化方法如下,可以看到我們前面提到migrate.cfg和versions就是在這里被使用的,而且名字也是固定的,必須為migrate.cfg和versions。

class Repository(pathed.Pathed):   """A project's change script repository"""    _config = 'migrate.cfg'   _versions = 'versions'    def __init__(self, path):     log.debug('Loading repository %s...' % path)     self.verify(path)     super(Repository, self).__init__(path)     self.config = cfgparse.Config(os.path.join(self.path, self._config))     self.versions = version.Collection(os.path.join(self.path,                            self._versions))     log.debug('Repository %s loaded successfully' % path)     log.debug('Config: %r' % self.config.to_dict()) 

這里會驗證我們傳入的path下面是否存在versions和migrate.cfg,因此我們的代碼目錄結構也必須按照這個放。self.config主要是用來管理migrate.cfg的配置,self.versions主要用來管理如何升級,repository對象另外還包含3個比較重要的屬性,latest:最新的版本(versions中版本號最大的),這里是73,version_table:用來記錄和管理migrate版本號的數據庫表,這里是migrate_version,id用來存放我們管理的數據庫標示,這里是heat,后兩項都是從數據庫里面取。

@property   def latest(self):     """API to :attr:`migrate.versioning.version.Collection.latest`"""     return self.versions.latest    @property   def version_table(self):     """Returns version_table name specified in config"""     return self.config.get('db_settings', 'version_table')    @property   def id(self):     """Returns repository id specified in config"""     return self.config.get('db_settings', 'repository_id') 

回到之前的代碼

try:   return versioning_api.db_version(engine, repository) except versioning_exceptions.DatabaseNotControlledError:   meta = sqlalchemy.MetaData()   meta.reflect(bind=engine)   tables = meta.tables   if len(tables) == 0 or 'alembic_version' in tables:     db_version_control(engine, abs_path, version=init_version)     return versioning_api.db_version(engine, repository)   else:     raise exception.DBMigrationError(       _("The database is not under version control, but has "        "tables. Please stamp the current version of the schema "        "manually.")) 

這里會根據數據庫引擎和剛才的repository實例對象獲取當前數據庫的版本號,其實就是從migrate本身所在數據表中去查找當前的版本號(version_version),假如是第一次使用migrate,由于還沒有建立migrate_version表,所以引發異常。這里會去查一下當前數據庫中的所有數據表,如果已有其他數據庫表,則會引發DBMigrationError的異常,因為migrate必須在建立其他數據表之前先建立才能管控所有的數據表,假如我們之前沒有使用migrate機制但是想在后面的db控制中使用起來,這里有2個思路:手動插入migrate_version數據表并配置合適的版本或者手動插入alebic_version。

繼續往下面看,如果是第一次使用migrate,

db_version_control(engine, abs_path, version=init_version) 

會建立migrate_version,并設置合適的初始值,也就是傳入的init_version,后續的數據庫升級等操作就可以通過migrate管控起來了。migrate_version表建立起來后,就回到了最初的流程,根據我們db_sync傳入的版本號和當前的版本號,migrate會執行versions里面每個版本的upgrade()方法直至升級完成并更新migrate_version中的版本號。

  使用migrate的好處在于,可以很方便的集中記錄和管理每次對數據庫的變動,在后續升級過程中,一鍵式完成對應的適配操作,非常方便,并且不會出現重復增加字段等操作,在開發過程中,我們只要知道了migrate的原理,就能很方便的使用起來了。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文欧美日本在线资源| 中文字幕日韩欧美精品在线观看| 一区二区在线视频播放| 91精品久久久久久综合乱菊| 51精品在线观看| 亚洲网站视频福利| 中国china体内裑精亚洲片| 91国语精品自产拍在线观看性色| 国产成人一区二区三区| 久久99精品视频一区97| 红桃av永久久久| 亚洲女在线观看| 欧美久久久精品| 成人福利网站在线观看11| 国产精品国产三级国产aⅴ浪潮| 国产精品视频自拍| 亚洲人成网站在线播| 国产精品视频男人的天堂| 久久琪琪电影院| 在线亚洲男人天堂| 亚洲二区中文字幕| 亚洲国产精品字幕| 成人两性免费视频| 亚洲人成电影网站色| 日韩va亚洲va欧洲va国产| 亚洲视频一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久夜色精品亚洲噜噜国产mv| 亚洲2020天天堂在线观看| 欧美精品福利在线| 亚洲一区二区免费| 欧美性做爰毛片| 国产一区二区激情| 欧美日本中文字幕| 日韩精品亚洲元码| 国产精品成人aaaaa网站| 午夜精品蜜臀一区二区三区免费| 亚洲精品久久久久久久久久久久久| 欧美巨大黑人极品精男| 欧美最顶级丰满的aⅴ艳星| 51ⅴ精品国产91久久久久久| 久久久久久久一区二区三区| 欧洲中文字幕国产精品| 国产一区二区在线免费| …久久精品99久久香蕉国产| 91wwwcom在线观看| 亚洲欧美日韩精品久久亚洲区| 久久99精品久久久久久噜噜| 91精品国产91久久久久久| 久久乐国产精品| 精品夜色国产国偷在线| 国产成人精品一区| 亚洲一品av免费观看| 性色av一区二区三区在线观看| 日韩成人网免费视频| 青青久久av北条麻妃海外网| 91香蕉嫩草神马影院在线观看| 国产精品99蜜臀久久不卡二区| 久久久久一本一区二区青青蜜月| 欧美性猛交丰臀xxxxx网站| 国产精品视频自在线| 97超级碰在线看视频免费在线看| 久热爱精品视频线路一| 久久久久久av| 亚洲国产精品热久久| 精品香蕉一区二区三区| 激情懂色av一区av二区av| 韩剧1988在线观看免费完整版| 成人av.网址在线网站| 精品福利视频导航| 91亚洲一区精品| 91产国在线观看动作片喷水| 91精品国产色综合久久不卡98口| 91精品国产自产在线观看永久| 亚洲美女黄色片| 高清一区二区三区日本久| 97国产成人精品视频| 欧美电影免费观看电视剧大全| 久久久欧美精品| 成人免费视频在线观看超级碰| 亚洲大胆美女视频| 日韩美女av在线免费观看| 亚洲日韩欧美视频| 91在线观看免费观看| 精品国内产的精品视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 日韩有码片在线观看| 日本一本a高清免费不卡| 亚洲石原莉奈一区二区在线观看| 国产在线观看精品一区二区三区| 国产精品91在线观看| 亚洲免费人成在线视频观看| 91色琪琪电影亚洲精品久久| 热re99久久精品国产66热| 懂色av一区二区三区| 中文字幕亚洲欧美日韩2019| 亚洲精品欧美日韩| 26uuu日韩精品一区二区| 亚洲精品白浆高清久久久久久| 久久婷婷国产麻豆91天堂| 久久久女人电视剧免费播放下载| 第一福利永久视频精品| 欧美亚洲激情在线| 亚洲一区亚洲二区| 国产噜噜噜噜久久久久久久久| 亚洲欧美中文另类| 久久精品国产久精国产一老狼| 97视频在线观看亚洲| 亚洲精品丝袜日韩| 亚洲成在人线av| 国产亚洲欧洲在线| 国产精品专区h在线观看| 奇米四色中文综合久久| 欧美激情亚洲一区| 国产精品爽爽爽爽爽爽在线观看| 日韩激情片免费| 一区二区欧美激情| 国产成人久久久| 日本一区二区在线免费播放| 久久影院资源站| 日韩中文字幕在线播放| 国产日韩av在线| 国产精品一区二区在线| 亚洲最大av网站| 日韩精品免费在线观看| 欧美中文字幕精品| 精品国产一区二区三区久久| 国产成人精品一区| 91成人国产在线观看| 欧美日韩国产中文精品字幕自在自线| 国产精品美女在线观看| 亚洲第一网站免费视频| 国产精品久久久久久亚洲调教| 欧美一区二区大胆人体摄影专业网站| 日韩成人中文电影| 亚洲欧洲在线免费| 欧美激情亚洲综合一区| 91精品国产91久久久| 俺去亚洲欧洲欧美日韩| 永久555www成人免费| 国产日韩精品综合网站| 日韩电影中文字幕在线观看| 亚洲第一精品久久忘忧草社区| 日本亚洲精品在线观看| 国产精品扒开腿爽爽爽视频| 亚洲高清不卡av| 久久综合五月天| 亚洲欧美另类人妖| 亚洲美女喷白浆| 成人福利视频在线观看| 久久激情视频免费观看| 欧美成人精品在线视频| 亚洲欧洲日产国产网站| 欧美激情中文网| 91精品国产色综合久久不卡98口| 不卡av电影院| 91精品国产综合久久香蕉922| 色av中文字幕一区| 欧美日韩裸体免费视频| 97高清免费视频| 国产精品永久免费视频| 欧美视频中文在线看| 亚洲理论片在线观看| 色综久久综合桃花网|