數(shù)據(jù)庫(kù)開發(fā)升級(jí)變更技術(shù)探究(數(shù)據(jù)庫(kù)升級(jí)和配置變更前)

      網(wǎng)友投稿 1140 2022-05-30

      【Liquibase】

      Liquibase是一個(gè)獨(dú)立于數(shù)據(jù)庫(kù)的開源庫(kù),用于跟蹤、管理和部署數(shù)據(jù)庫(kù)設(shè)計(jì)的變化。它發(fā)布于2006年,旨在更容易跟蹤數(shù)據(jù)庫(kù)的變化,特別適合在敏捷軟件開發(fā)環(huán)境中使用。

      概述

      對(duì)數(shù)據(jù)庫(kù)的所有更改都存儲(chǔ)在文本文件(XML、YAML、JSON或SQL)中,并通過(guò)?"id "和?"author "標(biāo)簽以及文件本身的名稱來(lái)識(shí)別。在每個(gè)數(shù)據(jù)庫(kù)中都存儲(chǔ)了一個(gè)含有所有部署的更改列表,在數(shù)據(jù)庫(kù)更新時(shí)都會(huì)被查閱,以確定需要部署哪些新的更改。?有一個(gè)特點(diǎn)要注意,這種方法不是用版本號(hào)來(lái)管理數(shù)據(jù)庫(kù)設(shè)計(jì)變化,因此沒有數(shù)據(jù)庫(kù)的版本號(hào),但這種方法允許多個(gè)開發(fā)人員和多個(gè)代碼分支的協(xié)同工作。

      Liquibase在第一次執(zhí)行changeLog文件時(shí),會(huì)自動(dòng)創(chuàng)建DatabaseChangeLog表和DatabaseChangeLogLock表。

      主要功能

      l??30多個(gè)內(nèi)置數(shù)據(jù)庫(kù)重構(gòu)器

      l??可擴(kuò)展性,創(chuàng)建自定義更改

      l??將數(shù)據(jù)庫(kù)更新為當(dāng)前版本

      l??回滾到數(shù)據(jù)庫(kù)中的最后X次修改

      l??回滾數(shù)據(jù)庫(kù)更改到特定日期/時(shí)間

      l??回滾數(shù)據(jù)庫(kù)到?"標(biāo)簽"

      l??可以保存數(shù)據(jù)庫(kù)更新和回滾的SQL,以便手動(dòng)查看。

      l??獨(dú)立的IDE和Eclipse插件

      l??用于包括/排除要執(zhí)行的更改集的上下文

      l??數(shù)據(jù)庫(kù)差異報(bào)告

      l??數(shù)據(jù)庫(kù)差異變化記錄的生成

      l??能夠創(chuàng)建變更日志進(jìn)而生成現(xiàn)有數(shù)據(jù)庫(kù)的能力。

      l??數(shù)據(jù)庫(kù)變更文檔的生成

      l??DBMS檢查、用戶檢查和SQL檢查的前提條件

      l??能夠?qū)⒆兏罩痉指畛啥鄠€(gè)文件,便于管理。

      l??可通過(guò)命令行、Apache Ant、Apache Maven、servlet容器或Spring框架執(zhí)行。

      l??支持10個(gè)數(shù)據(jù)庫(kù)系統(tǒng)

      商業(yè)版

      Datical既是Liquibase項(xiàng)目的最大貢獻(xiàn)者,也是Datical DB的開發(fā)者,Datical DB是一個(gè)提供Liquibase核心功能和附加功能的商業(yè)產(chǎn)品。

      l??變更預(yù)測(cè)。預(yù)測(cè)即將執(zhí)行的變化,在運(yùn)行之前就預(yù)測(cè)即將執(zhí)行的變化,以確定這些變化將如何影響你的數(shù)據(jù)。

      l??規(guī)則引擎來(lái)執(zhí)行企業(yè)標(biāo)準(zhǔn)和策略。

      l??支持?jǐn)?shù)據(jù)庫(kù)的存儲(chǔ)邏輯:函數(shù)、存儲(chǔ)過(guò)程、包、表空間、觸發(fā)器、序列、用戶定義的類型、同義詞等。

      l??比較數(shù)據(jù)庫(kù),可以對(duì)兩個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)定義進(jìn)行比較,以識(shí)別變更,并輕松地將其移動(dòng)到變更日志中。

      l??變更集向?qū)В詳?shù)據(jù)庫(kù)中立的方式輕松定義和捕獲數(shù)據(jù)庫(kù)變更。

      l??部署計(jì)劃向?qū)В糜诮:凸芾砟倪壿嫴渴鸸ぷ髁鞒獭?/p>

      l??Jenkins、Bamboo、UrbanCode、CA Release Automation (Nolio)、Serena Release Automation、BMC Bladelogic、Puppet、Chef、以及所有流行的源碼控制系統(tǒng)如SVN、Git、TFS、CVS等的插件。

      使用Datical DB的人員包括DBA、發(fā)布經(jīng)理、DevOps團(tuán)隊(duì)、應(yīng)用程序所有者、架構(gòu)師以及參與應(yīng)用程序發(fā)布過(guò)程的開發(fā)人員。它以程序化的方式管理數(shù)據(jù)庫(kù)設(shè)計(jì)變化和部署程序代碼,消除了錯(cuò)誤和延遲,實(shí)現(xiàn)了快速敏捷發(fā)布。Datical DB建立在Liquibase數(shù)據(jù)模型方法的基礎(chǔ)上,在應(yīng)用程序版本從開發(fā)到測(cè)試到生產(chǎn)環(huán)境的過(guò)程中,管理數(shù)據(jù)結(jié)構(gòu)的特定內(nèi)容。在部署之前,Datical可以在任何環(huán)境中預(yù)覽設(shè)計(jì)變化的影響,從而降低了風(fēng)險(xiǎn),使應(yīng)用程序的變化更加順暢和快速。

      Liquibase開發(fā)人員Nathan Voxland是Datical公司的高管。

      【使用案例】

      添加依賴

      數(shù)據(jù)庫(kù)開發(fā)升級(jí)變更技術(shù)探究(數(shù)據(jù)庫(kù)升級(jí)和配置變更前)

      org.liquibase

      liquibase-core

      3.8.7

      數(shù)據(jù)庫(kù)變更日志文件樣本

      xmlns="http://www.liquibase.org/xml/ns/dbchangelog"

      xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext

      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd

      http://www.liquibase.org/xml/ns/dbchangelog

      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

      在上面這個(gè)簡(jiǎn)單例子中,我們?cè)诒砀駏ser中添加一個(gè)新的字段nickeName。

      用?"Spring Bean"運(yùn)行Liquibase

      我們?cè)趹?yīng)用程序啟動(dòng)時(shí)部署更改的第一個(gè)選擇是通過(guò)Spring bean。當(dāng)然,還有很多其他的方法,但如果我們要使用Spring框架的話,這是個(gè)很好的而且簡(jiǎn)單的方法。

      @Bean

      public?SpringLiquibase?liquibase()?{

      SpringLiquibase?liquibase?=?new?SpringLiquibase();

      liquibase.setChangeLog("classpath:liquibase-changeLog.xml");

      liquibase.setDataSource(dataSource());

      return?liquibase;

      }

      注意:?我們將其指向一個(gè)在classpath上存在的有效的changeLog文件。

      如果使用的是Spring Boot

      如果你使用的是Spring Boot,就不需要為L(zhǎng)iquibase定義一個(gè)Bean。

      你只需要將你的變更日志放到:

      "db/changelog/db.changelog-master.yaml "中,Liquibase的更改部署就會(huì)在啟動(dòng)時(shí)自動(dòng)運(yùn)行。

      需要注意的是:

      l??你需要添加?"liquibase-core "依賴。

      l??你可以使用?"liquibase.change-log "屬性來(lái)更改默認(rèn)的日志文件,例如:

      liquibase.change-log=classpath:liquibase-changeLog.xml

      在Spring Boot中禁用Liquibase

      有時(shí),我們可能需要在啟動(dòng)時(shí)禁用Liquibase遷移的執(zhí)行。

      我們最簡(jiǎn)單的方法是使用?spring.liquibase.enabled?屬性。這樣一來(lái),所有剩下的Liquibase配置就不會(huì)被觸動(dòng)。

      下面是Spring Boot 2的例子:

      spring.liquibase.enabled=false

      對(duì)于?Spring Boot 1.x,我們需要使用?liquibase.enabled?屬性。

      liquibase.enabled=false

      使用Maven插件生成變更記錄

      我們可以使用Liquibase Maven插件來(lái)生成一個(gè)變更記錄文件,而不是手動(dòng)編寫記錄文件,這樣可以節(jié)省很多工作。

      org.liquibase

      liquibase-maven-plugin

      3.x.x

      org.liquibase

      liquibase-maven-plugin

      3.4.1

      src/main/resources/liquibase.properties

      我們可以使用該插件從現(xiàn)有的數(shù)據(jù)庫(kù)中生成一個(gè)變更記錄。

      mvn liquibase:generateChangeLog

      以下是liquibase的屬性配置:

      url=jdbc:xxxx

      username=xxx

      password=xxx

      driver=x.Driver

      outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml

      最終的結(jié)果是一個(gè)changeLog文件,我們可以用它來(lái)創(chuàng)建一個(gè)初始DB設(shè)計(jì)定義或填充數(shù)據(jù)。下面是我們的示例的樣子:

      我們可以使用插件從兩個(gè)現(xiàn)有數(shù)據(jù)庫(kù)(例如:開發(fā)數(shù)據(jù)庫(kù)和生產(chǎn)數(shù)據(jù)庫(kù))之間的差異生成一個(gè)變更記錄文件。

      mvn liquibase:diff

      下面是屬性配置:

      changeLogFile=src/main/resources/liquibase-changeLog.xml

      url=jdbc:xxxxxx

      username=xxxx

      password=xxxx

      driver=xxxxx.Driver

      referenceUrl=jdbc:xxxxx

      diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

      referenceDriver=xxxxx

      referenceUsername=xxx

      referencePassword=xxx

      下面是生成的變更記錄的片段:

      這是一個(gè)超級(jí)強(qiáng)大的方法來(lái)進(jìn)化你的數(shù)據(jù)庫(kù),例如,允許Hibernate自動(dòng)生成一個(gè)新的設(shè)計(jì)定義來(lái)進(jìn)行開發(fā),然后用它作為參考點(diǎn)來(lái)對(duì)照舊的設(shè)計(jì)定義。

      使用Liquibase Hibernate插件

      如果應(yīng)用程序使用Hibernate,我們來(lái)看一個(gè)非常有用的生成變更記錄的方法。

      首先,讓我們把新插件配置好,并使用正確的依賴關(guān)系。

      org.liquibase

      liquibase-maven-plugin

      3.x.x

      src/main/resources/liquibase.properties

      org.liquibase.ext

      liquibase-hibernate4

      3.5

      org.springframework

      spring-beans

      X.RELEASE

      org.springframework.data

      spring-data-jpa

      X.RELEASE

      現(xiàn)在,有趣的部分來(lái)了。我們可以使用這個(gè)插件從現(xiàn)有正式數(shù)據(jù)庫(kù)(例如生產(chǎn)數(shù)據(jù)庫(kù))和我們的開發(fā)實(shí)體數(shù)據(jù)的差異中生成一個(gè)變更記錄文件。

      因此,為了使事情變得簡(jiǎn)單,一旦修改了一個(gè)實(shí)體,你可以簡(jiǎn)單地對(duì)照舊的DB設(shè)計(jì)定義生成修改,從而獲得一個(gè)干凈而又強(qiáng)大的方式來(lái)進(jìn)化你在生產(chǎn)數(shù)據(jù)庫(kù)中的設(shè)計(jì)定義。

      以下是liquibase的屬性:

      changeLogFile=classpath:liquibase-changeLog.xml

      url=jdbc:xxxxx

      username=xxxx

      password=xxx

      driver=xxxx

      referenceUrl=hibernate:xxxx

      ?dialect=org.hibernate.dialect.MySQLDialect

      diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

      注意:referenceUrl使用的是包掃描,所以需要方言參數(shù)。

      【官方網(wǎng)站】

      http://www.liquibase.org/

      【最新版本】

      3.8.7于2020年2月24日

      【License】

      Apache License 2.0

      【Flyway】

      Flyway是一個(gè)開源的數(shù)據(jù)庫(kù)升級(jí)遷移工具。

      Flyway?基于七個(gè)基本命令:遷移、清理、信息、驗(yàn)證、撤銷、基線和修復(fù)。

      遷移可以用SQL(支持特定數(shù)據(jù)庫(kù)的語(yǔ)法,如PL/SQL、T-SQL等)或Java(用于高級(jí)數(shù)據(jù)轉(zhuǎn)換或處理LOB)。

      它有一個(gè)命令行客戶端,一個(gè)用于在應(yīng)用程序啟動(dòng)時(shí)遷移數(shù)據(jù)庫(kù)的Java API(也適用于Android),一個(gè)Maven插件和一個(gè)Gradle插件。

      插件支持包括Spring Boot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja等。

      支持的數(shù)據(jù)庫(kù)包括Oracle、SQL Server、DB2、MySQL(包括Amazon RDS、Aurora MySQL、MariaDB)、Percona XtraDB、PostgreSQL(包括Amazon RDS和Heroku)、Aurora PostgreSQL、CockroachDB、Redshift、Informix、H2、Hsql、Derby、SQLite、SAP HANA、Sybase ASE、Phoenix和Firebird。

      業(yè)內(nèi)影響

      僅在2018年,F(xiàn)lyway就獲得了1150萬(wàn)次下載。

      2015年1月,F(xiàn)lyway被列入了Thoughtworks科技雷達(dá)的?"推薦使用"板塊,

      2019年7月,F(xiàn)lyway被Redgate收購(gòu)。

      Flyway是如何工作的

      Flyway通過(guò)添加一張記賬表來(lái)記錄和跟蹤變更是否被部署,何時(shí)被部署,由誰(shuí)部署。這張表還會(huì)記錄部署校驗(yàn)和,以及是否部署成功。

      該框架執(zhí)行以下步驟以適應(yīng)不斷變化的數(shù)據(jù)庫(kù)設(shè)計(jì)定義:

      l??檢查一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)定義,以定位其元數(shù)據(jù)表(默認(rèn)情況下是SCHEMA_VERSION)。如果元數(shù)據(jù)表不存在,它將創(chuàng)建一個(gè)

      l??掃描應(yīng)用程序的classpath,以尋找可用的變更。

      l??根據(jù)元數(shù)據(jù)表比較變更情況。如果版本號(hào)低于或等于標(biāo)記為當(dāng)前版本,則會(huì)被忽略。

      l??將任何剩余的變更標(biāo)記為待處理的變更。根據(jù)版本號(hào)進(jìn)行排序,并按順序執(zhí)行。

      l??隨著每次變更的部署,元數(shù)據(jù)表也會(huì)相應(yīng)地更新

      Flyway?支持以下基本命令來(lái)管理數(shù)據(jù)庫(kù)遷移:

      Info:?打印數(shù)據(jù)庫(kù)模式的當(dāng)前狀態(tài)/版本。它打印出哪些變更正在等待中,哪些變更已經(jīng)被部署,應(yīng)用的變更狀態(tài)以及何時(shí)部署的。

      Migrate:將數(shù)據(jù)庫(kù)設(shè)計(jì)定義變更到當(dāng)前版本。它掃描classpath以尋找可用的變更,并部署待處理的變更。

      Baseline:對(duì)現(xiàn)有數(shù)據(jù)庫(kù)進(jìn)行基準(zhǔn)化,不包括遷移,包括基準(zhǔn)線版本?;鶞?zhǔn)線設(shè)定以后有助于在現(xiàn)有數(shù)據(jù)庫(kù)中實(shí)行增量變更,即可以正常部署較新的變更。

      Validate:?根據(jù)可用的變更來(lái)驗(yàn)證當(dāng)前的數(shù)據(jù)庫(kù)模式。

      Repair:?修復(fù)元數(shù)據(jù)表。

      Clean:丟棄已配置設(shè)計(jì)定義中的所有對(duì)象。所有數(shù)據(jù)庫(kù)對(duì)象都會(huì)被丟棄。因此,不要在任何生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)中使用clean。

      【使用案例】

      插件安裝配置

      org.flywaydb

      flyway-maven-plugin

      xxx

      這個(gè)插件有四種配置方法:

      org.flywaydb

      flyway-maven-plugin

      xxx

      XXX

      XXX

      XXX

      schemaName

      XXX

      XXX

      XXX

      schemaName

      flyway.url=XXX

      flyway.user=XXX

      flyway.password=XXX

      flyway.schemas=schemaName

      默認(rèn)的配置文件名稱是flyway.properties,它應(yīng)該和pom.xml文件位于同一目錄下。編碼由flyway.encoding指定(默認(rèn)為UTF-8)。

      如果您使用任何其他名稱(如?customConfig.properties)作為配置文件,那么在調(diào)用?Maven?命令時(shí)應(yīng)該明確指定它。

      mvn -Dflyway.configFile=customConfig.properties

      最后,在命令行中調(diào)用Maven時(shí),所有的配置屬性也可以指定為系統(tǒng)屬性:

      mvn -Dflyway.url=databaseUrl ?-Dflyway.user=databaseUser -Dflyway.password=databasePassword

      -Dflyway.schemas=schemaName

      以下是當(dāng)一個(gè)配置以多種方式指定時(shí)的優(yōu)先順序:

      1.??????系統(tǒng)屬性

      2.??????外部配置文件

      3.??????Maven屬性

      4.??????插件配置

      定義第一次遷移

      Flyway?遵循以下變更腳本的命名規(guī)則:

      __.sql

      其中:

      l?? -?默認(rèn)前綴為V,可以在上述配置文件中使用

      l??flyway.sqlMigrationPrefix屬性配置。

      l?? -?遷移版本號(hào)。主要版本和次要版本可以用下劃線分開。遷移版本應(yīng)該總是以1開頭。

      l?? -?遷移的文本描述。描述需要用雙下劃線與版本號(hào)分開。

      比如:?V1_1_0__my_first_migration.sql

      接下來(lái),讓我們?cè)?PROJECT_ROOT中創(chuàng)建一個(gè)目錄db/migration,用一個(gè)名為V1_0__create_employee_schema.sql的變更腳本來(lái)創(chuàng)建雇員表,其中包含SQL指令。

      CREATE?TABLE?IF?NOT?EXISTS?`employee`?(

      `id`?int?NOT?NULL?AUTO_INCREMENT?PRIMARY?KEY,

      `name`?varchar(20),

      `email`?varchar(50),

      `date_of_birth`?timestamp

      )ENGINE=InnoDB?DEFAULT?CHARSET=UTF8;

      執(zhí)行變更

      接下來(lái),我們從$PROJECT_ROOT中調(diào)用以下Maven命令來(lái)執(zhí)行數(shù)據(jù)庫(kù)變更:

      mvn clean flyway:migrate -Dflyway.configFile=myFlywayConfig.properties

      第一次成功變更成功以后,數(shù)據(jù)庫(kù)設(shè)計(jì)定義應(yīng)該是如下的樣子:

      employee:

      +----+------+-------+---------------+

      | id | name | email | date_of_birth |

      +----+------+-------+---------------+

      我們可以重復(fù)上述設(shè)計(jì)定義和執(zhí)行步驟來(lái)做更多的變更。

      定義和執(zhí)行第二次變更

      讓我們通過(guò)創(chuàng)建第二個(gè)變更文件,名稱為

      V2_0_create_department_schema.sql,包含兩條語(yǔ)句,來(lái)看看第二個(gè)遷移是什么樣子的。

      CREATE?TABLE?IF?NOT?EXISTS?`department`?(

      `id`?int?NOT?NULL?AUTO_INCREMENT?PRIMARY?KEY,

      `name`?varchar(20)

      )ENGINE=InnoDB?DEFAULT?CHARSET=UTF8;

      ALTER?TABLE?`employee`?ADD?`dept_id`?int?AFTER?`email`;

      我們執(zhí)行類似的變更命令。而現(xiàn)在,我們的數(shù)據(jù)庫(kù)模式發(fā)生了變化,為雇員表增加了一個(gè)新的列和一個(gè)新的部門表。

      employee:

      +----+------+-------+---------+---------------+

      | id | name | email | dept_id | date_of_birth |

      +----+------+-------+---------+---------------+

      department:

      +----+------+

      | id | name |

      +----+------+

      我們現(xiàn)在可以通過(guò)調(diào)用下面的Maven命令來(lái)驗(yàn)證這兩個(gè)變更是成功的:

      mvn flyway:info -Dflyway.configFile=myFlywayConfig.properties

      禁用Spring Boot中的Flyway

      有時(shí),我們可能需要在某些情況下禁用Flyway變更。

      例如,在測(cè)試過(guò)程中,從實(shí)體生成數(shù)據(jù)庫(kù)設(shè)計(jì)定義是一種常見的做法,遇到這種情況,我們可以在測(cè)試配置文件下禁用Flyway。

      讓我們來(lái)看看Spring Boot中的做法有多簡(jiǎn)單。

      我們需要做的就是在application-test.properties文件中設(shè)置

      flyway.enabled屬性。

      flyway.enabled=false

      在最新版本的Spring Boot中,該屬性已被更改為?spring.flyway.enabled。

      spring.flyway.enabled=false

      如果我們只想在啟動(dòng)時(shí)禁用Flyway自動(dòng)變更,但仍能手動(dòng)觸發(fā)變更,那么使用上述屬性并不是一個(gè)好的選擇。

      這是因?yàn)樵谶@種情況下,Spring Boot?不會(huì)再自動(dòng)配置?Flyway。因此,我們必須自己提供,這不是很方便。

      為了實(shí)現(xiàn)這樣的需求,我們可以啟用Flyway,同時(shí)實(shí)現(xiàn)一個(gè)空的FlywayMigrationStrategy配置類:

      @Configuration

      public?class?EmptyMigrationStrategyConfig?{

      @Bean

      public?FlywayMigrationStrategy?flywayMigrationStrategy()?{

      return?flyway?->?{

      //?do?nothing

      };

      }

      }

      這樣做會(huì)在應(yīng)用程序啟動(dòng)時(shí)禁用Flyway遷移,同時(shí)我們?nèi)匀豢梢允謩?dòng)觸發(fā)變更。

      @RunWith(SpringRunner.class)

      @SpringBootTest

      public?class?ManualFlywayMigrationIntegrationTest?{

      @Autowired

      private?Flyway?flyway;

      @Test

      public?void?skipAutomaticAndTriggerManualFlywayMigration()?{

      flyway.migrate();

      }

      }

      【官方網(wǎng)站】

      https://flywaydb.org/

      【最新版本】

      6.4.0于2020年4月21日

      【License】

      Apache License 2.0

      【小結(jié)】

      本文對(duì)于數(shù)據(jù)庫(kù)相關(guān)的設(shè)計(jì)定義及其在開發(fā)過(guò)程中常用的工具做了一番介紹,希望對(duì)現(xiàn)有或者以后的業(yè)務(wù)開發(fā)提供幫助和借鑒。

      數(shù)據(jù)庫(kù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Linux系統(tǒng)開發(fā): 學(xué)習(xí)Linux下網(wǎng)絡(luò)編程(linux開發(fā)板)
      下一篇:【API進(jìn)階之路】因?yàn)椴粫?huì)創(chuàng)建云服務(wù)器,我被實(shí)習(xí)生擺了一道(api部署云服務(wù)器)
      相關(guān)文章
      亚洲成a人片在线观看无码专区| 亚洲日本久久一区二区va| 亚洲成年网站在线观看| 久久久婷婷五月亚洲97号色 | 亚洲色成人中文字幕网站| 亚洲毛片不卡av在线播放一区| 日韩精品亚洲专区在线观看| 亚洲日本一线产区和二线| 亚洲中文字幕久久久一区| 一本色道久久综合亚洲精品蜜桃冫| 色偷偷亚洲女人天堂观看欧| 一本色道久久综合亚洲精品蜜桃冫| 亚洲日韩国产精品乱-久| 亚洲综合无码一区二区痴汉| 在线观看亚洲AV每日更新无码| 亚洲AV成人一区二区三区在线看 | 中文字幕亚洲乱码熟女一区二区| 中文字幕日韩亚洲| 亚洲乱码中文字幕久久孕妇黑人| 国产亚洲真人做受在线观看| 久久国产亚洲精品麻豆| 亚洲AV无码欧洲AV无码网站| 日产亚洲一区二区三区| 亚洲精品中文字幕乱码| 亚洲综合色区中文字幕| 亚洲人成网站18禁止| 亚洲a∨无码精品色午夜| 亚洲AV无码成人精品区大在线| 亚洲国产精品毛片av不卡在线| 亚洲情a成黄在线观看| 亚洲中文久久精品无码| 好看的亚洲黄色经典| 综合自拍亚洲综合图不卡区| 亚洲乱码一区av春药高潮| 亚洲夂夂婷婷色拍WW47| 国产AV日韩A∨亚洲AV电影| 久久久久一级精品亚洲国产成人综合AV区| 中文字幕不卡亚洲| 亚洲国产一区二区三区青草影视| 亚洲视频手机在线| 亚洲人av高清无码|