精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文詳解Liquibase如何自動化數據庫腳本部署

譯文
數據庫 其他數據庫 自動化
本文通過實例的形式,向您介紹并展示了一種能夠實現自動化腳本部署的數據庫產品--Liquibase。

[[439170]]

【51CTO.com快譯】您是否還在手動對數據庫執行各種腳本?您是否還在浪費時間去驗證數據庫腳本的正確性?您是否還需要將腳本合并到某個文件中,以便在每個環境中執行?在面對部署錯誤時,您是否需要花費數小時去查看數據庫的更改,以定位原因?

如今,大多數組織都已經在其應用程序中實施了DevOps的CI/CD流程。不過,其數據庫的自動化改造似乎尚未跟上時代。為此,我將向您介紹一種能夠實現自動化腳本部署的數據庫產品--Liquibase。

Liquibase的基本特點

  • 自動化數據庫的部署腳本。
  • 以相同的方式部署到不同的環境中。
  • 能夠為每次數據庫的更改準備好回滾。
  • 能夠將部署的所有詳細信息集中到一處。
  • 最少化的部署錯誤。
  • 方便開發人員針對相同的數據庫,進行高效的協同編程。
  • 審核逐個更改(請參考下圖)。

下面,我將向您展示如何使用Liquibase和Git在Pretius上,自動化數據庫的更改過程。

什么是Liquibase?

Liquibase(簡稱LB)是一個用Java編寫的開源工具。它以用戶熟悉的格式定義了數據庫接口,并能夠自動生成特定于數據庫的SQL。例如,它將數據庫的更改(每一次更改可稱為一個更改集)放入被稱為changelog的文件中進行管理。通常,Liquibase在數據庫架構中會自動創建兩張表:

  • DATABASECHANGELOG — 存儲有關數據庫所有更改信息的表。
  • DATABASECHANGELOGLOCK — 用于防止用戶同時對數據庫進行更改。

我將在下面示例中,基于SQL編寫變更集,以實現對Oracle數據庫的自動化更改過程。

從安裝Liquibase開始

請通過鏈接https://www.liquibase.org/download,選擇“僅文件(Just the files)”的方式,下載Liquibase的最新版本。在本文中,我將使用版本:4.3.0 build 09.02.2021。

在將其zip文件夾解壓縮后,您必須將新的路徑變量(New Path System Variable)設置為計算機上的liquibase-version#bin文件夾。同時,為了使Liquibase正常工作,您還必須安裝Java。

通過在CLI工具(在此,我使用的是Visual Studio Code)輸入:Liquibase—version,您將能看到:

如果您在文件中使用的是UTF8編碼,那么請務必在liquibase.bat文件中添加一行:IF NOT DEFINED JAVA_OPTS set JAVA_OPTS=-Dfile.encoding=UTF–8。

配置項目和Liquibase

下面,讓我們來組織各個文件(在本例中,我的GIT存儲庫放在文件夾HR中)。在各個文件夾中,我們可以在項目開發的過程中創建不同的文件。如果您有其他類型的對象(如“創建或替換”類型),那么只需要用它們創建“同義(synonyms)”文件夾即可。

Liquibase中的文件組織

  1. #path to our master changelog file 
  2. changeLogFile:Liquibase/update.xml 
  3. #dbhost and credentials 
  4. url:  jdbc:oracle:thin:@127.0.0.1:1521/XEPDB1 
  5. username: HR 
  6. password: XXXXXX 
  7. #OJDBC driver localization 
  8. classpath:Liquibase/ojdbc8.jar 
  9. #schema, whereLiquibasewill store it’s DATABASECHANGELOG and DATABASECHANGELOGLOCK table(if other than HR, remember to add grants to HR!) 
  10. liquibaseSchemaName: HR 
  11. #default  SQL file name generated byLiquibase 
  12. outputFile=output_local.sql 
  13. #debug mode 
  14. loglevel=SEVERE 
  15. #extra option fromLiquibase, we don’t need it for now. 
  16. liquibase.hub.mode=off 

更新了的Liquibase文件夾結構

現在,我們創建一個update.xml文件,并將它放入帶有OJDBC文件的、新的 hr/Liquibase文件夾中:

  1. <?xml version="1.0″ encoding="UTF-8″?><databaseChangeLog 
  2. xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
  5. http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd"></databaseChangeLog> 

使用 Oracle Wallet(可選)

如果您的Oracle數據庫托管在Oracle自治數據庫上,那么就需要使用Wallet,通過Liquibase去連接它。為此,請下載Wallet并記住其密碼。

請將您的WALLET_NAME.ZIP解壓到之前創建的HR/Liquibase文件夾中,并編輯HR/liquibase/wallet_name/ojdbc.properties文件:

更改ojdsb.properties

修改后的文件如上圖所示。在javax.net.ssl.trustStorePassword和javax.net.ssl.keyStorePassword行,你可以設置ATP Wallet的密碼。

在liquibase_local.properties文件中,請編輯URL一行,并設置連接的名稱(即,來自Wallet/tnsnames.ora,以及去往Wallet的路徑):

  1. url: jdbc:oracle:thin:@rgatp28_high?TNS_ADMIN=liquibase/Wallet_RGATP28 

當然,請檢查您的sqlnet.ora文件,確保其“SSL_SERVER_DN_MATCH=yes”,且無需改變其他地方。

將Liquibase與數據庫連接

如果一切設置正確,我們便可以順利連接上DEV數據庫。讓我們從HR文件夾(Liquibase的屬性文件位置)處啟動CLI,并輸入:

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

VSCode終端中的updateSQL命令

其中:

  • Liquibase會調用LB的環境路徑。
  • defaultsFile指定屬性文件的名稱和位置。如果您將屬性文件命名為“liquibase.properties”,那么可以省略此命令。
  • updateSQL負責生成SQL腳本(它并不會對數據庫執行任何操作)。

幾秒鐘后,LB將會生成output_file.sql:

生成的output_file.sql

如前所述,如果您在數據庫中運行該腳本,它將創建兩個表:DATABASECHANGELOG和DATABASECHANGELOGLOCK。下面,讓我們通過Liquibase—defaultsFile=liquibase_dev.properties update,來創建這些表。其中的update命令是對數據庫執行SQL語句。完成后,您將看到如下結構:

我們需要創建一個changelog文件,并指向包含對象的文件夾。在此,我創建了如下HR/master.xml文件:

  1. <?xml version="1.0″ encoding="UTF-8″?> 
  2. <databaseChangeLog 
  3. xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
  6. http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd"> 
  7. <includeAll path="triggers" relativeToChangelogFile="true"/> 
  8. <includeAll path="views" relativeToChangelogFile="true"/> 
  9. <includeAll path="types" relativeToChangelogFile="true"/> 
  10. <includeAll path="package_spec" relativeToChangelogFile="true"/> 
  11. <includeAll path="package_bodies" relativeToChangelogFile="true"/> 
  12. </databaseChangeLog> 

它指向對象文件夾、及其所有內容。為了將主changelog文件HR/liquibaseupdate.xml設置為指向master.xml文件的路徑,您只需添一行:

  1. <include file="./master.xml"/> 

在update.xml中的include file="./master.xml"

由于Liquibase始終會從Liquibase_dev.properties文件和update.xml文件處運行,因此我們需要讓它能夠“看到”所有的文件。

跟蹤DML和DDL數據庫的更改

我們需要為DML和DDL類型的更改創建一個單獨的changelog文件,并將更改集寫入其中。為此,我們只需創建一個changelog.sql文件,并輸入如下內容,以將其標記為LiquibaseSQL文件:

  1. —Liquibaseformatted sql 

將changelog.sql標記為LiquibaseSQL文件

我們通過在master.xml文件中添加如下內容,以指向新的changelog:

指向新的changelog

指向changelog或文件夾的順序是非常重要的。它需要告知Liquibase在運行SQL時的順序。我們最好先運行changelog(其中包含了“create table(...)”),然后再運行使用該表的編譯包。

下面,讓我們在變更集中創建第一個項目表:

  1. —changeset AUTHOR:CHANGESET_NAME 
  2. —comment OPTIONAL COMMENT 
  3. YOUR DDL 

創建第一個項目表

為了預覽到數據庫有哪些更改,我們讓LB生成對應的SQL文件。

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

由Liquibase生成SQL文件

您可能注意到了,LB通過設置LOCKED = 1,來鎖定DATABASECHANGELOGLOCK表。也就是說,當您將腳本運行到DB時,列LOCKED被設置為1。而當另一個用戶同時運行LB時,Liquibase將為此等待,直到鎖定被放開,再創建一個SHOES表,將日志的更改插入到DATABASECHANGELOG中,并從DATABASECHANGELOGLOCK表中釋放掉已有的鎖。

如果一切正常,如下腳本會被執行到數據庫中:

  1. Liquibase—defaultsFile=liquibase_dev.properties update 

接著,表SHOES會被創建出來。

我們也可以查詢到誰、為何、以及何時創建了這張表。

跟蹤包、視圖等其他更改

我們也可以如法創建其他腳本。在此,我通過2個單獨的文件,創建了一個SHOES_PKG包。每個文件都是帶有附加參數的唯一變更集,并被標記為Liquibase格式的SQL文件。

SHOES_BODY和SHOES_SPEC SQL文件

其中:

  • runOnChange:true ——意味著每次更改包時,Liquibase都會針對數據庫運行該變更集,也就是編譯這個包。
  • stripComments:false ——意味著不要去除代碼注釋。

因此,LB在對數據庫進行updateSQL操作時,就會去編譯包的規范(package spec)、以及包的主體(package body)。一旦我們在數據庫中通過update命令編譯這些包,它們都會被記錄下來。

通過查看MD5SUM的列值可知,它是變更集的最后一次校驗和。也就是說,運行了updateSQL后,所有前期被“掛起”的更改都被執行,而且除了鎖定LB表外,LB不會在SQL中生成任何內容。

運用updateSQL檢查output_local.sql

現在,讓我們改變SHOES_PKG本身,并保存該文件。

更新SHOES_PKG本身

那么該文件的校驗和會發生變化,LB將再次編譯這個包,并運行更新。

Liquidbase中的更新

數據庫中的更新

Liquibase將再次編譯這個包,并使用DATABASECHANGELOG表中的實際DATEEXECUTED和新的MD5SUM等變更集,去更新相應的行。

如何在現有軟件項目中安裝Liquibase?

雖然我們好幾種方法可以讓Liquibase為現有的數據庫實現自動化,但是我在此只向您展示最實用的兩種。您可以從中選擇最適合實際需求的一種。

當現有的項目中有很多對象時

我們通過在項目的存儲庫中配置Liquibase,并保留所有文件的基礎上,在master.xml文件中添加指向它們的路徑。具體而言,在實施Liquibase之前,我創建了2個過程和2個觸發器:

  1. P_ADD_JOB_HISTORY 
  2. P_SECURE_DML 
  3. TRG_SECURE_EMPLOYEES 
  4. TRG_UPDATE_JOB_HISTORY 

現有的P_ADD_JOB_HISTORY.sql文件

您并不需要將“changeset”或“–Liquibaseformatted sql”添加到文件中。

更新后master.xml中的文件路徑

我在自己的master.xml中添加了一個指向PROCEDURES文件夾的路徑。

下面,讓我們運行LiquibaseupdateSQL,并查看Liquibase會執行什么樣的SQL:

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

首次嘗試更新SQL

既然我們的數據庫中已經有了這些過程和觸發器,我們就需要通過ChangelogSync和ChangelogSyncSQL命令,避免重復創建。讓我們運行ChangelogSyncSQL,并查看其結果。

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSyncSQL 

輸出的SQL文件為:

可見,SQL文件只插入了一個DATABASECHANGELOG表。它會告知Liquibase這些對象已經創建好了,不需要再次運行。現在,我們便可以將其插入到Oracle數據庫中了:

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSync 

此時,在DATABASECHANGELOG表中會有4個新的變更集:

您也許會問,這些奇怪的“raw”ID 是什么?為什么作者又被稱為“includeAll”呢?這是因為我們采取了最簡單、最快捷的方式,將現有的項目遷移到了Liquibase處,而這些變更集是被自動創建的。

當然,您也可以進行一些更改。例如,在P_ADD_JOB_HISTORY中,只需添加一個changeset,就像您在創建新數據庫對象時常做的那樣。

更改P_ADD_JOB_HISTORY

然后運行Liquibase的更新命令:

現在,Changeset就帶有了合適的作者、ID等信息。

在上面的示例中,我向您展示了添加現有對象(可創建或替換)的簡單方法,且無需手動創建變更集。我認為這是將Liquibase安裝到擁有數百個對象的、現有數據庫中的最佳方式。不過,當涉及到庫里有不能被替換的對象(如表格)時,我們需要使用另一種方式。

當現有項目中沒有很多對象時

創建或替換的對象

正如前面所描述過的,請添加對象,并在master.xml文件中記下文件夾的路徑。接著請運行ChangelogSync,并讓Liquibase自動創建raw/includeAll/filename的變更集。

由Liquibase生成的變更集

當然,您也可以采用更好的方法,為每個文件創建一個變更集,如下圖所示:

雖然這會需要更多的工作,但是您可以在日志中獲得更全面的信息:

針對無法創建或替換的對象,您同樣有兩種方法:

  • 對這些對象不做任何操作,但請記住始終為其中的每個更改(包括:更改表、刪除列等)創建變更集,并將其添加到changelog.sql文件中。
  • 創建變更集并將它們標記為過去已被執行過。

在此,我們著重討論第二種方式。由于在實施Liquibase之前我已創建好了EMPLOYEES和JOBS兩張表,因此我會在新的文件夾HR/scripts_before_Liquibase中,創建changelog_ddl.sql和changelog_constraints.sql兩個changelog文件。此外,我也創建了另一個scripts_before_liquibase.xml文件,并將其指向這兩個changelog。其中的“include file”通過優先級的方式,告知Liquibase運行腳本的順序,即:首先創建表,然后創建約束和索引。

新的scripts_before_liquibase.xml文件

這兩個文件能夠方便您在表中創建ref_constraint時,避免產生沖突。如下圖所示,請記住在master.xml文件中,將路徑添加到新創建的XML文件(即HR/script_before_liquibase/scripts_before_liquibase.xml)中。

下面是為各種表和約束創建的變更集。

在添加了所有的變更集之后,我們將它們標記為已執行的狀態。

讓我們運行ChangelogSyncSQL來進行預覽,并讓ChangelogSync對數據庫執行SQL。

運行ChangeSyncSQL和ChangelogSync

下圖展示了ChangelogSync命令執行后,更新了的數據庫。至此,我們已大功告成,您也可以選用自己喜歡的方式,通過Liquibase來實現數據庫的自動化。

小結

如您所見,通過使用Liquibase,我們可以在數據庫更改的發布過程中,跟蹤所有的相關內容。其中,需要開發人員遵守如下流程:

  • 基于變更集的唯一性,并結合AUTHOR:ID(task)與文件名(帶changelog的文件),將變更集添加到changelog中。而且,請不要在沒有Liquibase的情況下,更改任何內容。
  • 驗證待執行的SQL。
  • 運行數據庫的update命令(記住,應當先運行updateSQL,再執行update命令)。
  • 通過檢查數據庫對象和DATABASECHANGELOG表,驗證變更集是否已被執行。

原文標題:What is Liquibase? How to Automate Your Database Script Deployment,作者:Rafal Grzegorczyk

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

 

責任編輯:華軒 來源: 51CTO
相關推薦

2020-12-11 10:20:33

Ansible運維軟件包

2022-02-15 08:07:17

測試軟件開發

2021-03-16 12:08:32

Python 服務器腳本

2024-02-29 14:27:37

人工智能機器學習物聯網

2015-05-28 10:46:22

shellBackupdatabase

2019-08-27 20:00:23

2023-02-13 23:39:48

數據庫Mongodb存儲

2016-12-20 16:47:25

Hadoop部署腳本

2020-04-30 15:00:17

運維Ansible自動化

2014-03-11 11:10:10

PowerShell自動化腳本

2023-12-26 07:40:34

2022-07-28 09:02:41

文件存儲系統

2023-07-17 10:45:03

向量數據庫NumPy

2013-02-27 15:48:05

自動化備份FacebookPB級別數據庫

2020-07-16 07:30:15

數據庫SQL技術

2011-05-12 13:15:36

數據庫日常維護

2017-01-17 15:14:49

MySQL數據庫自動化

2025-04-03 08:30:00

Python數據庫ORM

2023-11-29 16:16:14

Redis數據庫

2024-01-11 07:32:00

點贊
收藏

51CTO技術棧公眾號

一级一级黄色片| 午夜在线观看一区| 蜜臀久久精品| 中文字幕国产一区| 99国产在线视频| 中日韩黄色大片| 日韩精品诱惑一区?区三区| 欧美一卡二卡三卡| 国产超级av在线| 嫩草在线视频| 91麻豆高清视频| 国产女精品视频网站免费| 精品一区免费观看| 精品日韩欧美一区| 精品久久五月天| 亚洲高清在线免费观看| 污的网站在线观看| 久久无码av三级| 97自拍视频| 国产成人精品亚洲| 亚洲网址在线| 精品国产拍在线观看| 亚洲av网址在线| 精品中文字幕一区二区三区四区 | 黄色在线免费观看网站| 中文字幕一区不卡| 欧美资源一区| 五月天婷婷社区| 国产一区二区在线观看视频| 国产精品99蜜臀久久不卡二区| 中文字幕手机在线观看| 日韩精品二区| 亚洲欧洲黄色网| 国产人成视频在线观看| 另类视频一区二区三区| 欧美性受xxxx黑人xyx性爽| 无码专区aaaaaa免费视频| av理论在线观看| 国产精品美女久久久久久久| 欧美日韩精品久久久免费观看| 好吊色一区二区| 国产福利91精品一区二区三区| 国产日韩欧美视频在线| 欧美成人一区二区三区四区| 国产欧美短视频| 欧美极度另类性三渗透| 精品国产乱码久久久久久鸭王1| 成人一区不卡| 亚洲最新在线视频| 麻豆av免费观看| 色婷婷av一区二区三区丝袜美腿| 欧美成人一区二区| 黑人巨大猛交丰满少妇| www.久久爱.com| 91精品麻豆日日躁夜夜躁| www.超碰97.com| 久久青草视频| 欧美午夜电影在线播放| 91蝌蚪视频在线观看| 欧美色999| 欧美伊人精品成人久久综合97| 日韩a在线播放| 国产精品粉嫩| 欧美午夜在线观看| 亚洲欧美久久久久| 亚洲精品tv| 日韩欧美国产系列| youjizz.com日本| 精品欧美午夜寂寞影院| 亚洲国产另类久久精品| 亚洲少妇18p| 亚洲v天堂v手机在线| 日韩精品高清在线| 老熟妇一区二区| 久久国产成人精品| 欧美精品一区三区| 国产又黄又爽又色| 美女一区二区视频| 91在线直播亚洲| www久久久久久| 99国产一区二区三精品乱码| 免费观看成人在线| 中文字幕在线观看日本| 亚洲蜜臀av乱码久久精品| 青青草国产免费| 原纱央莉成人av片| 欧美美女直播网站| 国产高潮失禁喷水爽到抽搐| 欧美黑人巨大videos精品| 亚洲天堂开心观看| 日韩一级片大全| 一本色道精品久久一区二区三区| 国产成人精品视频| av网站免费大全| 91小视频免费看| 一区二区三区四区欧美| 久草在线新免费首页资源站| 婷婷成人激情在线网| 爱情岛论坛vip永久入口| 精品成人18| 亚洲免费电影一区| 日韩高清dvd碟片| 国产日韩免费| 91丨九色丨国产在线| 五月色婷婷综合| ●精品国产综合乱码久久久久| 日韩国产成人无码av毛片| 偷拍视频一区二区三区| 欧美电影免费观看完整版| 在线免费观看麻豆| 欧美三级午夜理伦三级中文幕| 国产91精品高潮白浆喷水| 国产精品怡红院| 久久亚洲精品国产精品紫薇| 欧美a级黄色大片| 久久野战av| 亚洲国产精品999| 日韩精品一区二区亚洲av性色| 国产精品亚洲综合久久| 亚洲在线免费观看| 1024免费在线视频| 日韩欧美综合在线视频| av地址在线观看| 色综合咪咪久久网| 国产成人精品在线观看| 日本高清视频www| 亚洲欧美日韩综合aⅴ视频| 777米奇影视第四色| 成人涩涩网站| 美日韩精品视频免费看| 中文字幕在线播出| 99精品欧美一区二区三区小说 | 国产精品一区在线播放| 免费黄色在线看| 欧美日韩在线免费视频| 午夜在线观看一区| 久久久国产亚洲精品| 精品高清视频| heyzo高清国产精品| 日韩欧美一区二区不卡| 日韩欧美综合视频| 精品一区二区在线免费观看| 亚洲成人蜜桃| 久久99国产精品二区高清软件| 亚洲欧美成人一区二区在线电影| 日本网站免费观看| 成人国产视频在线观看| 欧美日韩午夜爽爽| 精品国产一级| 欧美成人免费va影院高清| 国产又粗又大又爽视频| 国产精品第一页第二页第三页| 一本岛在线视频| 色一区二区三区四区| 国产欧美中文字幕| 日本不卡视频| 日韩一区二区三区视频在线| 久久99久久99精品免费看小说| 久久激情五月婷婷| 国产高清精品软男同| 国产一精品一av一免费爽爽| 毛片精品免费在线观看| www.国产精品视频| 亚洲午夜精品在线| 波多野结衣有码| 噜噜噜久久亚洲精品国产品小说| 欧美亚洲免费在线| 日韩制服一区| 久久天天躁日日躁| 亚洲乱码精品久久久久..| 亚洲a一区二区| 国产精品亚洲无码| 日本不卡一区二区三区| 美国av在线播放| h视频久久久| 欧洲亚洲妇女av| fc2在线中文字幕| 欧美精品 日韩| 免看一级a毛片一片成人不卡| a在线欧美一区| 蜜臀视频一区二区三区| 亚洲天天影视网| 高清一区二区三区视频| 一区二区三区四区日本视频| 神马国产精品影院av| 亚洲av永久纯肉无码精品动漫| 精品日韩美女的视频高清| 日韩欧美黄色网址| 国产精品一区在线观看你懂的| 精品人妻少妇一区二区| 欧美精品乱码| 2014亚洲精品| 欧美成人性网| 久久深夜福利免费观看| 日本高清视频网站| 欧美视频在线不卡| 国产精品自拍视频一区| 国产精品美女久久久久久久| 国产精久久久久| 日本亚洲免费观看| 精品无码一区二区三区爱欲| 精品日韩一区| 国产精品一区二区av| 在线成人视屏| 97精品在线观看| 国产三级在线播放| 亚洲免费一级电影| www.av日韩| 欧美日韩另类一区| 亚洲精品视频在线观看免费视频| 国产精品免费丝袜| a天堂视频在线观看| 国内精品不卡在线| www.日日操| 国产亚洲精品bv在线观看| 蜜臀av.com| 人人狠狠综合久久亚洲婷婷| 九九久久99| **爰片久久毛片| 国产日产欧美精品| www.日韩| 97色在线视频| 黄网av在线| 久久视频中文字幕| 69久久夜色| 亚洲欧洲国产精品| 日本一区二区三区在线观看视频| 精品欧美一区二区在线观看| 一区二区三区免费在线| 在线免费不卡电影| 69成人免费视频| 香蕉成人啪国产精品视频综合网| 麻豆视频在线免费看| 国产精品免费丝袜| 国产在线免费av| 国产欧美一区二区精品性色| 亚洲成人日韩在线| 成人av在线看| 国内精品免费视频| 粉嫩绯色av一区二区在线观看 | 亚洲免费资源| 国产免费一区二区三区在线能观看| 欧美专区福利免费| 欧美在线观看网站| 亚洲欧洲日本韩国| 欧美在线影院在线视频| 色戒汤唯在线观看| 欧美一级电影在线| 美女视频在线免费| 97精品国产91久久久久久| av白虎一区| 久久全球大尺度高清视频| 蜜臀av在线| 久久免费视频在线观看| 超碰资源在线| 5278欧美一区二区三区| 偷拍自拍在线看| 日韩av电影免费观看高清| 日韩中文影院| 国产精品久久久久av免费| 精品美女一区| 91香蕉电影院| 99re8这里有精品热视频免费| 99精品国产高清在线观看| 综合中文字幕| 鲁鲁视频www一区二区| 国内精品久久久久久久影视简单| 日本一区二区在线| 91麻豆精品国产91久久久平台| 中日韩在线视频| 国产综合婷婷| 男人操女人免费软件| 人人狠狠综合久久亚洲| 国产成人在线综合| 国产成人亚洲综合a∨婷婷| 欧美极品jizzhd欧美仙踪林| 97久久精品人人爽人人爽蜜臀| 熟女少妇一区二区三区| 中文字幕免费在线观看视频一区| 日韩av手机在线免费观看| 亚洲一区二区三区视频在线| 日韩免费不卡视频| 91久久人澡人人添人人爽欧美 | 精品在线免费视频| 成人三级做爰av| wwwwww.欧美系列| 91麻豆制片厂| 亚洲一区二区三区四区五区黄 | 欧美激情国产精品免费| 午夜精品福利在线| 亚洲欧美日韩激情| 538在线一区二区精品国产| 免费的黄色av| 中文字幕日韩精品有码视频| 日本天码aⅴ片在线电影网站| 欧美自拍大量在线观看| 国产精品久久免费视频| 精品国产一区二区三区麻豆免费观看完整版| 伊人久久综合影院| 在线观看18视频网站| 欧美一级专区| 中文字幕 欧美 日韩| 久久精品视频一区二区| 亚洲天堂黄色片| 在线这里只有精品| 亚洲av无码乱码国产麻豆| 国产亚洲欧洲高清一区| 成人在线高清免费| 国产乱肥老妇国产一区二| 欧美一区二区三区红桃小说| 国产精品jizz在线观看老狼| 久久久久网站| 国产免费a级片| |精品福利一区二区三区| 日日夜夜操视频| 日韩精品自拍偷拍| 在线观看麻豆| 国产不卡视频在线| 里番精品3d一二三区| 免费观看国产视频在线| 日本成人在线一区| 欧美一区二区三区成人精品| 亚洲综合成人在线| 国产精品视频久久久久久| 亚洲色图25p| 美女搞黄视频在线观看| 国产精品久久亚洲| 四虎成人精品永久免费av九九| 国产精品亚洲二区在线观看| 不卡高清视频专区| 福利所第一导航| 欧美一三区三区四区免费在线看| 91在线看片| 国产精品91一区| 国产亚洲一区| 成人在线观看黄| 91丝袜国产在线播放| av资源免费观看| 亚洲精品99久久久久| 成人免费网站观看| 精品欧美国产一区二区三区不卡| 亚洲高清毛片| 性久久久久久久久久久| 午夜av一区二区| 天天射,天天干| 69久久夜色精品国产69| 美女视频亚洲色图| 欧美亚洲精品一区二区| www..com久久爱| 欧美啪啪小视频| 亚洲视频在线免费观看| 国产精品亚洲d| 亚洲欧洲精品在线观看| 久久成人久久鬼色| 99精品久久久久| 欧美精品一区二区三区高清aⅴ| 国产盗摄——sm在线视频| 成人av男人的天堂| 一区二区三区国产盗摄| 蜜桃无码一区二区三区| 欧美在线观看禁18| 米奇精品一区二区三区| 亚洲一区二区三区香蕉 | 大肉大捧一进一出好爽动态图| 2020国产精品自拍| 伊人精品一区二区三区| 久久亚洲国产精品成人av秋霞| 亚洲一级大片| 日本精品免费在线观看| 国产欧美日韩一区二区三区在线观看| 中文字幕在线观看视频一区| 久久天天躁狠狠躁夜夜躁| 久久久久久毛片免费看 | 成人在线视频观看| 亚洲欧美一区二区原创| 狠狠色狠狠色合久久伊人| 麻豆91精品91久久久| 欧美本精品男人aⅴ天堂| 瑟瑟视频在线看| 成人综合色站| 欧美专区18| 国产精品20p| 777亚洲妇女| 嫩草香蕉在线91一二三区| 国产精品二区三区| 尹人成人综合网| av免费播放网站| 欧美一区二区播放| 自拍视频在线看| 亚洲人体一区| 高清av一区二区| 狠狠人妻久久久久久| 久久精品在线播放| 51亚洲精品| 性欧美极品xxxx欧美一区二区| 国产精品电影一区二区| 四虎精品在线| 成人午夜激情免费视频| 久久精品人人| 小泽玛利亚一区|