最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Openstack 使用migrate進(jìn)行數(shù)據(jù)庫升級(jí)實(shí)現(xiàn)方案詳細(xì)介紹

 更新時(shí)間:2016年12月04日 15:17:27   作者:Sylvernass  
這篇文章主要介紹了Openstack 使用migrate進(jìn)行數(shù)據(jù)庫升級(jí)詳細(xì)介紹的相關(guān)資料,數(shù)據(jù)庫表或者增加字段等是必然的事情,如何比較容易的進(jìn)行這些數(shù)據(jù)庫升級(jí)的適配和管理,這里提供實(shí)現(xiàn)方法,需要的朋友可以參考下

Openstack 使用migrate進(jìn)行數(shù)據(jù)庫升級(jí)實(shí)現(xiàn)方案詳細(xì)介紹

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

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


使用migrate進(jìn)行數(shù)據(jù)庫升級(jí)非常簡單,heat這邊提供了heat-manage db_sync, db_version的命令用來升級(jí)db以及查看當(dāng)前db的版本號(hào),這里以執(zhí)行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為我們需要升級(jí)到的版本,這里沒有傳,可以看到heat這邊是直接使用oslo_migrate的db_sync方法,我們看下三方庫中的這個(gè)方法。

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   //連接數(shù)據(jù)庫 
  :param abs_path:   Absolute path to migrate repository.         //migrate倉庫的絕對路徑 
  :param version:   Database will upgrade/downgrade until this version. //需要升級(jí)或者降級(jí)到的版本號(hào),如果不傳則默認(rèn)升級(jí)到最新版本 
             If None - database will update to the latest 
             available version. 
  :param init_version: Initial database version               //數(shù)據(jù)庫的初始版本號(hào),會(huì)以該初始版本為起點(diǎn)升級(jí) 
  :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 

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

首先是查詢當(dāng)前數(shù)據(jù)庫的版本,



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.")) 

首先是根據(jù)傳入的絕對路徑,構(gòu)造一個(gè)倉庫對象的示例,這里比較關(guān)鍵,初始化方法如下,可以看到我們前面提到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()) 

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

@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.")) 

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

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



db_version_control(engine, abs_path, version=init_version) 

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

  使用migrate的好處在于,可以很方便的集中記錄和管理每次對數(shù)據(jù)庫的變動(dòng),在后續(xù)升級(jí)過程中,一鍵式完成對應(yīng)的適配操作,非常方便,并且不會(huì)出現(xiàn)重復(fù)增加字段等操作,在開發(fā)過程中,我們只要知道了migrate的原理,就能很方便的使用起來了。

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

相關(guān)文章

  • 基于CentOS的OpenStack環(huán)境部署詳細(xì)教程(OpenStack安裝)

    基于CentOS的OpenStack環(huán)境部署詳細(xì)教程(OpenStack安裝)

    這篇文章主要介紹了基于CentOS的OpenStack環(huán)境部署(OpenStack安裝),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解VMware接入Openstack—使用Openstack創(chuàng)建vCenter虛擬機(jī)

    詳解VMware接入Openstack—使用Openstack創(chuàng)建vCenter虛擬機(jī)

    本篇文章主要介紹了VMware接入Openstack—使用Openstack創(chuàng)建vCenter虛擬機(jī),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • OpenStack 組件的更新教程

    OpenStack 組件的更新教程

    這篇文章主要給大家介紹的是OpenStack 組件的更新教程,更新而不是升級(jí),小伙伴們要注意哦,下面我們來詳細(xì)探討下吧
    2017-03-03
  • OpenStack API的使用套路分享

    OpenStack API的使用套路分享

    近期有openstack和vmware相關(guān)的開發(fā)需求,N年前從事虛擬化運(yùn)維的時(shí)候玩過了,所以對它倆的API使用套路早忘得一干二凈。這次借這個(gè)機(jī)會(huì)把使用套路做個(gè)文檔并分享出來,希望可以幫到有需要的盆友
    2023-02-02
  • openstack云計(jì)算組件keystone部署及操作使用技巧

    openstack云計(jì)算組件keystone部署及操作使用技巧

    這篇文章主要為大家介紹了openstack云計(jì)算組件keystone部署及操作使用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Fuel快速安裝OpenStack圖文教程

    Fuel快速安裝OpenStack圖文教程

    這篇文章主要為大家詳細(xì)介紹了Fuel快速安裝OpenStack圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • openstack云計(jì)算組件glance功能鏡像及版本介紹

    openstack云計(jì)算組件glance功能鏡像及版本介紹

    這篇文章主要為大家介紹了openstack云計(jì)算組件glance功能鏡像及版本介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 淺談openstack中使用linux_bridge實(shí)現(xiàn)vxlan網(wǎng)絡(luò)

    淺談openstack中使用linux_bridge實(shí)現(xiàn)vxlan網(wǎng)絡(luò)

    這篇文章主要介紹了淺談openstack中使用linux_bridge實(shí)現(xiàn)vxlan網(wǎng)絡(luò),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Openstack安裝過程中遇到的問題匯總

    Openstack安裝過程中遇到的問題匯總

    本文給大家分享的是作者在Centos7中安裝openstack過程中出現(xiàn)的一些問題的匯總,以及解決的方法,有需要的小伙伴可以參考下
    2017-04-04
  • OpenStack 中的Nova組件詳解

    OpenStack 中的Nova組件詳解

    Nova是OpenStack云中的計(jì)算組織控制器。支持OpenStack云中實(shí)例(instances)生命周期的所有活動(dòng)都由Nova處理。本文給大家介紹OpenStack 中的Nova組件,感興趣的朋友一起看看吧
    2016-11-11

最新評論

抚顺市| 大兴区| 永城市| 通州市| 金川县| 容城县| 陵川县| 明溪县| 云阳县| 左贡县| 奇台县| 靖州| 马公市| 南江县| 麻江县| 遵义市| 康定县| 岳西县| 康马县| 武城县| 施秉县| 安国市| 南乐县| 诸城市| 新疆| 土默特左旗| 宁晋县| 高台县| 新蔡县| 元朗区| 赞皇县| 北宁市| 延寿县| 龙岩市| 潜山县| 福建省| 陆河县| 渭源县| 田林县| 佛坪县| 宁陕县|