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

mysqldump一致性熱備原理剖析

數據庫 MySQL
mysqldump是實際場景中最常使用的備份工具之一,通過選擇合適的選項做備份,mysqldump可以保證數據的一致性,同時盡可能保證進行中的業務不受影響。

 引言

在日常數據庫運維中,經常要對數據庫進行熱備。熱備的一個關鍵點是保證數據的一致性,即在備份進行時發生的數據更改,不會在備份結果中出現。mysqldump是實際場景中最常使用的備份工具之一,通過選擇合適的選項做備份,mysqldump可以保證數據的一致性,同時盡可能保證進行中的業務不受影響。

那么mysqldump是如何實現一致性備份的?以下我將結合mysqldump過程中mysqld生成的general log與mysqldump的源碼來解釋mysqldump一致性備份的原理。

注:以下的實例基于MySQL 8.0.18,在不同版本上mysqldump的部分實現會有不同

首先用mysqldump執行一次一致性備份: 

  1. $ mysqldump -uroot -p --skip-opt --default-character-set=utf8  --single-transaction --master-data=2 --no-autocommit -B d1> backup.sql 

關鍵參數解釋:

  •  --single-transaction:執行一致性備份。
  •  --master-data=2:要求dump結果中以注釋形式保存備份時的binlog位置信息。
  •  -B:指定要dump的數據庫,在這里d1是一個使用InnoDB作為存儲引擎的庫,其中只有一個表t1。

執行完成后可以得到mysqld生成的general log,里面記錄了mysqldump在備份過程中傳給server的指令。

其中關鍵的步驟我用框框作了標記,具體的解釋請看下文。

mysqldump一致性備份的主要執行流程

  1.  連接server
  2.  兩次關閉所有表,第二次關表同時加讀鎖
  3.  設置隔離級別為“可重復讀”,開始事務并創建快照
  4.  獲取當前binlog位置
  5.  解鎖所有表
  6.  對指定的庫與表進行dump

下面結合SQL內容與源碼對以上主要步驟進行依次介紹。

流程剖析

1. 連接server

mysqldump首先與server建立連接,并初始化session,set一些session級的變量,對應SQL如下圖

其在main函數中對應的源碼就是一個對connect_to_db函數的調用: 

  1. if (connect_to_db(current_host, current_user, opt_password)) {  
  2.   free_resources();  
  3.   exit(EX_MYSQLERR); 

2. 兩次關閉所有表,第二次關表同時加讀鎖

連接建立后,mysqldump緊接著執行兩次關表操作,并在第二次關表同時給所有表加上讀鎖,對應SQL如下圖:

這一部分在main函數中對應的源碼為: 

  1. if ((opt_lock_all_tables || opt_master_data ||  
  2.      (opt_single_transaction && flush_logs)) &&  
  3.     do_flush_tables_read_lock(mysql))  
  4.   goto err; 

可以看到實際操作由do_flush_tables_read_lock函數進行,但是這里需要注意操作執行的前提條件,觀察代碼我們可以知道,這個關表操作只會在三種情況下進行:

  1.  通過--lock-all-tables選項顯式要求給所有表加鎖。
  2.  通過--master-data選項要求dump出來的結果中包含binlog位置。
  3.  通過--single-transaction指定了進行單事務的一致性備份,同時通過--flush-logs要求刷新log文件。

看到這里不難知道,除了第一種情況顯式要求加鎖之外,情況3要求刷新log前沒有其他事務在進行寫操作,自然要對所有表加上讀鎖。情況2要求dump結果中準確記錄dump進行時刻的binlog位置,為了準確地得到當前binlog的位置,自然就需要給所有的表加共享鎖,防止其他并行事務進行寫操作導致binlog更新,因此這里才有一個關表、加讀鎖的動作。

這里有一個細節,我們知道--single-transaction選項可以執行一致性備份,那么在只有--single-transaction選項時為什么不需要進行關表與加讀鎖的動作呢?這是因為--single-transaction所保證的一致性備份依賴于支持事務的存儲引擎(如InnoDB),在后面會提到,mysqldump通過執行START TRANSACTION WITH CONSISTENT SNAPSHOT會創建一個數據庫當前的快照與一個事務id,所有在該事務之后的事務所進行的數據更新都會被過濾,以此來保證備份的一致性。這種方式的優勢在于不會在進行一致性備份時干擾其他事務的正常進行,實現了所謂的“熱備”,但是缺點在于其依賴事務型存儲引擎,對于使用MyISAM等不支持事務的存儲引擎的表,--single-transaction無法保證它們的數據一致性。

接著查看do_flush_tables_read_lock函數的源碼: 

  1. static int do_flush_tables_read_lock(MYSQL *mysql_con) {  
  2.  return (mysql_query_with_error_report(  
  3.              mysql_con, 0,  
  4.             ((opt_master_data != 0) ? "FLUSH /*!40101 LOCAL */ TABLES"  
  5.                                     : "FLUSH TABLES")) ||  
  6.          mysql_query_with_error_report(mysql_con, 0,  
  7.                                        "FLUSH TABLES WITH READ LOCK"));  

可以看到邏輯比較簡單,就是向server傳入執行兩個query,依先后次序分別時FLUSH TABLES和FLUSH TABLES WITH READ LOCK,這里核心的動作在于后面一個query,之所以需要前面的FLUSH TABLES是基于性能的考量,以盡可能減少加鎖對其他事務的影響。

3. 設置隔離級別為“可重復讀”,開始事務并創建快照

關表操作執行完后,mysqldump接著開啟一個新事務并創建快照,對應SQL如下圖:

這一部分在main函數中對應的源碼為: 

  1. if (opt_single_transaction && start_transaction(mysql)) goto err; 

可以看到,只有在指定--single-transaction選項時這一步驟才會執行。實際上這一步就是mysqldump實現一致性熱備的基礎,我們接著查看start_transaction函數的源碼:

 

  1. static int start_transaction(MYSQL *mysql_con) {  
  2.  // 省略部分非關鍵代碼與注釋  
  3.  return (  
  4.      mysql_query_with_error_report(mysql_con, 0,  
  5.                                    "SET SESSION TRANSACTION ISOLATION "  
  6.                                    "LEVEL REPEATABLE READ") ||  
  7.      mysql_query_with_error_report(mysql_con, 0,  
  8.                                    "START TRANSACTION "  
  9.                                    "/*!40100 WITH CONSISTENT SNAPSHOT */"));  

可以看到核心動作是傳給server執行的兩個query,先是SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ確保當前會話的隔離級別是“可重復讀”,然后通過START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */來開始一個新事務,產生一個新事務id,同時創建一個快照,dump過程中所使用的數據都基于這個快照。這樣,所有在該事務之后的事務所進行的數據更新都會被過濾,備份的數據一致性因此得以保證。

但是,這樣的熱備方法,依賴于像InnoDB這樣支持事務的存儲引擎。相反,如MyISAM這種不支持事務的存儲引擎在備份過程中的數據一致性則不能被保證。

4. 獲取當前binlog位置

隨后mysqldump執行一個SHOW MASTER STATUS的query,以獲取當前binlog的位置信息:

查看main函數中對應部分的源碼可以看到,只有在指定--master-data選項時才會去獲取、記錄當前的binlog位置: 

  1. if (opt_master_data && do_show_master_status(mysql)) goto err; 

查看do_show_master_status函數的實現,可以看到核心動作就是向server傳入執行一個SHOW MASTER STATUS的query,最后將得到的binlog位置信息寫入dump結果中。 

  1. static int do_show_master_status(MYSQL *mysql_con) {  
  2.   MYSQL_ROW row;  
  3.   MYSQL_RES *master;  
  4.   const char *comment_prefix =  
  5.       (opt_master_data == MYSQL_OPT_MASTER_DATA_COMMENTED_SQL) ? "-- " : "";  
  6.   if (mysql_query_with_error_report(mysql_con, &master, "SHOW MASTER STATUS")) {  
  7.     return 1;  
  8.   } else {  
  9.     row = mysql_fetch_row(master); 
  10.      if (row && row[0] && row[1]) {  
  11.       print_comment(md_result_file, 0,  
  12.                     "\n--\n-- Position to start replication or point-in-time "  
  13.                     "recovery from\n--\n\n");  
  14.       // 寫入dump結果  
  15.       fprintf(md_result_file,  
  16.               "%sCHANGE MASTER TO MASTER_LOG_FILE='%s'MASTER_LOG_POS=%s;\n",  
  17.               comment_prefix, row[0], row[1]);  
  18.       check_io(md_result_file);  
  19.     }  
  20.     // ...  
  21.   }  
  22.   return 0;  

5. 解鎖所有表

在正式開始dump操作之前,mysqldump會把前面操作中可能加了鎖的表全部解鎖:

查看main函數中對應部分代碼: 

  1. if (opt_single_transaction &&  
  2.     do_unlock_tables(mysql)) /* unlock but no commit! */  
  3.   goto err; 

可以看到,只有在指定了--single-transaction選項時才會解鎖所有先前被加鎖的表,結合前面的思考可以推斷,--single-transaction下所進行的備份通過事務性質可以保證數據的一致性,沒有必要再保留對所有表所加的鎖,因此這里執行解鎖,以免阻塞其他事務的進行。

6. 對指定的庫與表進行dump

前面的準備操作進行完成后,mysqldump開始正式進行選定庫、表的dump操作:

對指定數據庫的實際dump由dump_databases函數執行(當指定了--all-databases要求dump所有庫時,則由dump_all_databases函數執行)。

查看dump_databases函數的實現: 

  1. static int dump_databases(char **db_names) {  
  2.   int result = 0 
  3.   char **db;  
  4.   DBUG_TRACE;  
  5.   for (db = db_names; *db; db++) {  
  6.     if (is_infoschema_db(*db))  
  7.       die(EX_USAGE, "Dumping \'%s\' DB content is not supported", *db);  
  8.     if (dump_all_tables_in_db(*db)) result = 1 
  9.   }  
  10.   if (!result && seen_views) {  
  11.     for (db = db_names; *db; db++) {  
  12.       if (dump_all_views_in_db(*db)) result = 1 
  13.     }  
  14.   }  
  15.   return result;  
  16. } /* dump_databases */ 

邏輯比較清晰,先dump每個指定的數據庫中所有的表,之后如果存在視圖,則將對應視圖也進行dump。我們的考察重點放在對表的dump上。

實際dump一個表的操作邏輯也比較清晰,就是先獲取表的結構信息,得到表的創建語句,然后獲取表中每行的實際數據并生成對應的insert語句。

不過,前面的general log中有個值得注意的點是SAVEPOINT的出現,這一點在MySQL 5.5的mysqldump中是沒有的,查看dump_all_tables_in_db函數的實現,可以找到設置savepoint的對應代碼: 

  1. // 創建savepoint  
  2.  if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {  
  3.    verbose_msg("-- Setting savepoint...\n");  
  4.    if (mysql_query_with_error_report(mysql, 0, "SAVEPOINT sp")) return 1;  
  5.  }  
  6.  while ((table = getTableName(0))) {  
  7.    char *end = my_stpcpy(afterdot, table);  
  8.    if (include_table(hash_key, end - hash_key)) { 
  9.      dump_table(table, database); // 對表進行dump  
  10.      // 省略部分代碼...  
  11.      // ROLLBACK操作 
  12.      /**  
  13.        ROLLBACK TO SAVEPOINT in --single-transaction mode to release metadata  
  14.        lock on table which was already dumped. This allows to avoid blocking  
  15.        concurrent DDL on this table without sacrificing correctness, as we  
  16.        won't access table second time and dumps created by --single-transaction  
  17.        mode have validity point at the start of transaction anyway.  
  18.        Note that this doesn't make --single-transaction mode with concurrent 
  19.         DDL safe in general case. It just improves situation for people for whom  
  20.        it might be working.  
  21.      */  
  22.      if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {  
  23.        verbose_msg("-- Rolling back to savepoint sp...\n");  
  24.        if (mysql_query_with_error_report(mysql, 0, "ROLLBACK TO SAVEPOINT sp"))  
  25.          maybe_exit(EX_MYSQLERR);  
  26.      } 

可以看到創建savepoint是在dump表之前,之后遍歷庫中的每個表,每當dump完一個表之后,便執行一次ROLLBACK TO SAVEPOINT sp操作,為什么呢?其實上面代碼的注釋已經解釋清楚了:

簡單來說,當我們dump完一個表后后面都不再需要使用這個表,這時其他事務的DDL操作不會影響我們dump得到數據的正確性,增加savepoint的意義在于,假如我們要dump表A,savepoint記錄了dump表A之前尚未給表A加MDL鎖的狀態,當開始dump表A時,由于要進行一系列select操作,會給表A加上MDL鎖防止其他事務的DDL操作改變表結構導致讀動作出錯;最后當對表A的dump完成后,后續都不會再訪問表A了,此時沒有釋放的MDL鎖沒有意義,反而會阻塞其他并行事務對表A的DDL操作。

對此,MySQL的解決方法是在訪問表A前通過SAVEPOINT sp記錄一個savepoint,在dump完表A之后通過ROLLBACK TO SAVEPOINT sp回到當時的狀態,即可釋放對表A加的MDL鎖,放行其他事務對該表的DDL操作。

小結

以上是mysqldump基于MySQL 8.0的一致性備份原理介紹,相比MySQL 5.5,現如今MySQL 8.0在mysqldump的實現存在一定改進,除了上面提到的savepoint機制是一個顯著區別之外,還有諸如對GTID的支持、對column statistics的dump操作在本文中沒有提及,但總體而言,mysqldump在一致性備份上的實現原理并沒有多少改變。

拓展閱讀——Percona的實現

MySQL從出現到普及,中途也出現了其他不少優秀的發行版,MySQL中一致性備份的實現其實也并不完美,因此如果能夠考量其他發行版在這方面上的實現,也是一件有意義的事情。

Backup Lock

在前面我有提到,mysqldump中--single-transaction選項所實現的一致性備份不需要對表加鎖,但這一特性基于事務型的存儲引擎,因此只對InnoDB表或使用其他事務型存儲引擎類型的表能夠保證備份時過濾掉其他并行事務的更新操作;但對使用了MyISAM這種不支持事務的存儲引擎的表,--single-transaction無法保證其數據的一致性,即若備份過程中出現了來自其他并行事務的更新操作,其很有可能被寫入了備份中。

既然如此,若想對MyISAM的表進行備份,又想保證其一致性該怎么辦?一種方式可以是在執行mysqldump時傳入--lock-all-tables選項,這個選項會使得dump操作進行之前執行一個FLUSH TABLES WITH READ LOCK語句,并保證在dump的全程保持對所有表的讀鎖。但是無疑這是一種overkill,僅僅是為了保證一部分非事務型存儲引擎的表的一致性,就需要對所有表加鎖,進而業務上所有對server的寫操作被阻塞一段時間(若備份的數據量大,這簡直會造成一場災難)。

這一問題,我尚未在MySQL 8.0中找到相應的好的解決方式,不過Percona對此給出了一個方案:在Percona發行版的mysqldump中,執行時可以傳入一個--lock-for-backup選項,這個選項會使得mysqldump在dump之前,執行一個LOCK TABLES FOR BACKUP語句,這是一個Percona獨有的query,其主要做以下幾件事情:

  •  阻塞對MyISAM, MEMORY, CSV, ARCHIVE表的更新操作;
  •  阻塞對任何表的DDL操作;
  •  不阻塞對臨時表與log表的更新操作。

顯然,有了以上的特性,當同時傳入--lock-for-backup與--single-transaction兩個選項同時,mysqldump可以保證所有表的數據一致性,并且盡可能保證造成最少的線上業務干擾。

這一部分邏輯可以在Percona Server 8.0中mysqldump的代碼中找到,在main函數中: 

  1. if (opt_lock_all_tables ||  
  2.     (opt_master_data &&  
  3.      (!has_consistent_binlog_pos || !has_consistent_gtid_executed)) ||  
  4.     (opt_single_transaction && flush_logs)) {  
  5.   if (do_flush_tables_read_lock(mysql)) goto err;  
  6.   ftwrl_done = true 
  7. } else if (opt_lock_for_backup && do_lock_tables_for_backup(mysql))  
  8.   goto err; 

細心的朋友會發現,這是對上面的“關表加讀鎖操作”進行的邏輯改寫,其增加了一個else if邏輯分支,取代了之前的FLUSH TABLES; FLUSH TABLES WITH READ LOCK;操作,主要目的是為了與--single-transaction進行的一致性備份更好地兼容,實現對線上業務盡可能少的阻塞。

接著查看do_lock_tables_for_backup函數的實現,可以看到就是簡單地向server傳入一個Percona獨有的LOCK TABLES FOR BACKUP語句: 

  1. static int do_lock_tables_for_backup(MYSQL *mysql_con) noexcept {  
  2.   return mysql_query_with_error_report(mysql_con, 0, "LOCK TABLES FOR BACKUP");  

Binlog Snapshot

在MySQL 8.0的實現中,有一個常用的選項,仍然會導致“討人厭”的FLUSH TABLES WITH READ LOCK的執行,即--master-data選項。

前面提到,--master-data選項要求在dump之后的結果中存有當前備份開始時的binlog位置,為了滿足所獲得binlog位置的一致性,需要在執行SHOW MASTER STATUS前,獲取對所有表的讀鎖以阻塞所有binlog的提交事件,因此要求執行一次FLUSH TABLES WITH READ LOCK。但是有沒有更好的方式?Percona同樣給出了自己的解決方法。

在Percona Server中,新增了兩個全局status:Binlog_snapshot_file和Binlog_snapshot_pos,分別用來記錄當前的binlog文件與binlog位置,通過SHOW STATUS LIKE 'binlog_snapshot_%'即可獲取兩個status的值。那么使用這個方式,跟SHOW MASTER STATUS有什么區別?

二者的區別在于,Binlog_snapshot_file和Binlog_snapshot_pos這兩個status具有事務性,只要在執行SHOW STATUS LIKE 'binlog_snapshot_%'這個語句之前通過START TRANSACTION WITH CONSISTENT SNAPSHOT創建了新事務與一致性快照,Binlog_snapshot_file和Binlog_snapshot_pos所記錄的則正是該事務開始時的binlog文件與位置信息,進而binlog信息的一致性得到保證,而這一過程的全程都不需要FLUSH TABLES WITH READ LOCK的執行。

相對的,SHOW MASTER STATUS是不具備事務性的,每次執行該語句返回的都是當前最新的binlog位置信息,這也是為什么執行它之前需要對所有表上讀鎖。 

 

責任編輯:龐桂玉 來源: 老葉茶館
相關推薦

2018-08-08 15:51:44

Hash分布式算法

2022-03-22 09:54:22

Hash算法

2020-11-24 09:03:41

一致性MySQLMVCC

2017-07-25 14:38:56

數據庫一致性非鎖定讀一致性鎖定讀

2017-06-27 09:40:28

MYSQL數據備份

2024-04-10 10:34:34

Cache系統GPU

2022-12-14 08:23:30

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數據

2023-08-14 08:10:33

CPU緩存RFO

2021-11-12 08:38:26

一致性哈希算法數據結構

2025-09-08 07:25:16

2020-05-12 10:43:22

Redis緩存數據庫

2022-10-19 12:22:53

并發扣款一致性

2021-06-30 21:13:49

CPUCache數據

2021-02-04 06:30:26

Python編程語言

2022-08-29 08:38:00

事務一致性

2021-06-22 10:22:08

業務IT一致性首席信息官

2021-07-27 08:57:10

算法一致性哈希哈希算法

2016-12-19 18:41:09

哈希算法Java數據
點贊
收藏

51CTO技術棧公眾號

在线观看欧美黄色| 国产日韩欧美一区在线| 欧美精品xxxxbbbb| 青草网在线观看| 男女av在线| 国内外成人在线视频| 久久理论片午夜琪琪电影网| 亚洲色成人网站www永久四虎| 色999久久久精品人人澡69| 亚洲男人天堂av网| 另类欧美小说| www.超碰在线.com| 久久午夜激情| 欧美国产高跟鞋裸体秀xxxhd| 国产又粗又猛又爽视频| 免费精品一区| 色老综合老女人久久久| 996这里只有精品| 91视频在线观看| bt欧美亚洲午夜电影天堂| 国产日韩欧美在线看| 日本网站免费观看| 91综合久久| 亚洲精品天天看| 色婷婷狠狠18禁久久| 成人全视频在线观看在线播放高清| 成人免费在线播放视频| 欧美不卡三区| 蜜臀久久99精品久久久| 久久精品国产亚洲高清剧情介绍| 亚洲91av视频| 麻豆亚洲av熟女国产一区二| 成人影院天天5g天天爽无毒影院| 亚洲国产精久久久久久久| 天天色天天干天天色| 国产69精品久久久久9999人| 福利二区91精品bt7086| 久青草视频在线播放| av在线中文| 久久久国产精品午夜一区ai换脸| 精品国产一区二区三区免费| 国产v在线观看| 韩国毛片一区二区三区| 国产精品久久一| www.亚洲激情| 日韩综合在线视频| 日韩av片电影专区| 成人免费a视频| 日韩三级中文字幕| 久久久久九九九| 六月婷婷中文字幕| 国产综合久久久久久久久久久久| 国产精品久久久久久av福利软件| 免费黄色网址在线| 一本久久综合| 欧美在线观看一区二区三区| 在线观看黄网站| 国产亚洲在线| 国产999在线| 波多野结衣视频观看| 日韩精品一二区| 国产精品久久一区主播| 在线观看亚洲一区二区| 久久99精品久久久久久久久久久久 | 天堂视频免费看| 全球中文成人在线| 91麻豆精品国产91久久久久久| 久久久福利影院| www国产精品| 亚洲精品美女久久久| 大又大又粗又硬又爽少妇毛片 | 天天干天天操天天干天天操| 黄色网址免费在线观看| 亚洲免费观看视频| av免费看网址| 日韩av福利| 欧美精品粉嫩高潮一区二区| 中文写幕一区二区三区免费观成熟| 国产精品午夜av| 亚洲欧美日韩图片| 欧美一区二区三区观看| 精品动漫av| 国产成人a亚洲精品| 国产一区二区三区视频免费观看| 国产成人亚洲综合色影视| 精品一区二区日本| 在线看av的网址| 亚洲午夜成aⅴ人片| 99精品视频在线看| 国产精品成人3p一区二区三区| 精品国产污网站| 亚洲AV无码成人精品区明星换面| 一区二区三区在线电影| 91av在线播放| 国产精品久久综合青草亚洲AV| 不卡一区二区在线| 亚洲一区二区三区精品在线观看| 欧美大片黄色| 欧美性三三影院| 91精品啪在线观看国产| 日韩一区三区| 欧美亚洲国产成人精品| av观看在线免费| 国产三级欧美三级日产三级99| 91嫩草国产丨精品入口麻豆| 欧美电影免费看| 欧美电影免费观看完整版| 欧美偷拍一区二区三区| 国模 一区 二区 三区| 国产精品女主播视频| 高清国产mv在线观看| 国产精品不卡视频| 久久国产乱子伦免费精品| 91国内精品| 色黄久久久久久| 国产午夜精品久久久久| 成人妖精视频yjsp地址| 一区二区三区一级片| 欧美国产大片| 亚洲精品自拍第一页| 九九热国产在线| 九九久久精品视频| 日韩一区二区电影在线观看| 蜜桃视频动漫在线播放| 欧美一级一级性生活免费录像| 我不卡一区二区| 性感少妇一区| 精品视频一区二区| 毛片在线网址| 精品三级在线看| 日韩一区二区三区四区在线| 久久精品国产一区二区三| 日韩一区二区三区高清| 欧美大电影免费观看| 日韩精品免费看| 日韩美女黄色片| 成人免费毛片app| 日本aa在线观看| 欧美欧美在线| 久99九色视频在线观看| 99精品免费观看| 日韩一区在线播放| 奇米视频888| 香蕉久久网站| 亚洲永久在线观看| 黄色av免费在线| 91精品国产综合久久精品性色| 国产精品视频在| 免费看欧美美女黄的网站| 日韩精品国内| 久久精品嫩草影院| 免费播放片a高清在线观看| 午夜精品久久99蜜桃的功能介绍| 国产精品久久久久久久av大片| 欧美孕妇孕交| 色综合久久综合网97色综合| 五月婷婷综合在线观看| 鲁大师成人一区二区三区| 欧美二区在线| 97欧美成人| 色悠悠久久久久| 国产精品一区二区黑人巨大| 亚洲人成在线观看一区二区| 午夜免费福利网站| 欧美天堂亚洲电影院在线观看 | 久久色免费在线视频| 国产精品一区二区免费视频| 亚洲综合丝袜美腿| 国产成人精品无码片区在线| 久久精品午夜| 伊甸园精品99久久久久久| 国产精品一站二站| 国产福利91精品| 色偷偷av亚洲男人的天堂| 中国女人一级一次看片| 亚洲视频资源在线| 黑森林av导航| 视频一区中文字幕| 欧美日韩视频免费在线观看| 粉嫩一区二区三区四区公司1| 欧美一区深夜视频| √新版天堂资源在线资源| 日韩美女一区二区三区| 国产精品国产三级国产专区52| 国产欧美日产一区| 日本泡妞xxxx免费视频软件| 久久激情婷婷| 午夜久久久久久久久久久| 欧美激情15p| 国产欧美久久一区二区| 国产精品xx| 日韩亚洲在线观看| 午夜黄色小视频| 欧美日韩视频在线观看一区二区三区| 欧美成人精品欧美一| 久久亚洲精华国产精华液| 婷婷激情5月天| 久久亚洲二区| 九一免费在线观看| 菠萝蜜一区二区| 国产高清在线一区| 日本中文字幕视频一区| 欧美激情一区二区久久久| 在线观看av黄网站永久| 亚洲黄在线观看| 国产专区在线视频| 大菠萝精品导航| 日韩中文字幕亚洲| 四虎影院在线播放| 日韩午夜小视频| 在线观看日批视频| 色综合天天天天做夜夜夜夜做| 欧美精品一级片| 中文字幕 久热精品 视频在线| 欧美深性狂猛ⅹxxx深喉| 国产米奇在线777精品观看| 色婷婷综合久久久久中文字幕 | 欧美精品免费看| 国产三级在线免费| 亚洲精品成人av| www.色日本| 制服丝袜日韩国产| 中国精品一区二区| 色8久久人人97超碰香蕉987| 女人十八岁毛片| 亚洲一线二线三线视频| 亚洲第一黄色网址| 国产成人精品三级| 在线观看国产一级片| 久久人人精品| 黄色a级片免费| 亚洲少妇在线| 亚洲熟妇av日韩熟妇在线| 欧美另类视频| 日本老太婆做爰视频| 亚洲色图欧美| 艳母动漫在线免费观看| 欧美激情成人| 一区二区三区视频在线播放| 日本电影一区二区| 日韩亚洲视频在线| 成人久久综合| 亚洲高清精品中出| 久久国产成人午夜av影院宅| 先锋在线资源一区二区三区| 国产影视一区| 色综合视频二区偷拍在线| 国产一区二区三区四区二区 | 亚洲国产精品狼友在线观看| 国产成人鲁色资源国产91色综| 在线观看国产一区二区| 永久免费未视频| 国产精品免费aⅴ片在线观看| 东方伊人免费在线观看| 黑人精品一区二区| 在线不卡免费欧美| 国产精品高潮呻吟av| 欧美一区二区久久久| 亚洲成人av综合| 亚洲第一区在线| 欧美日韩在线中文字幕| 国产亚洲xxx| 免费人成在线观看播放视频| 不卡av在线播放| sis001亚洲原创区| 欧美在线www| 国产91欧美| 成人免费视频网站| 色天下一区二区三区| 欧美在线视频二区| 999国产精品视频| 久久av综合网| 视频一区国产视频| 久久精品国产露脸对白| 成人中文字幕电影| 久久精品国产亚洲AV熟女| 国产精品污www在线观看| 蜜臀av午夜精品久久| 午夜视频久久久久久| 国产免费www| 欧美一区二区三区影视| 婷婷伊人综合中文字幕| 亚洲最新av在线| 欧美6一10sex性hd| 日本成人激情视频| 日本免费一区二区视频| 久久久久久国产精品mv| 欧美第十八页| 日本国产在线播放| 韩国精品在线观看| 中文字幕狠狠干| 亚洲欧美偷拍卡通变态| 丰满少妇xoxoxo视频| 91精品国产综合久久小美女 | 国产婷婷97碰碰久久人人蜜臀| 91九色在线porn| 午夜精品一区二区三区在线视频| 日本欧美韩国| 国产一区二区三区四区hd| 99成人超碰| 91看片就是不一样| 国产91丝袜在线播放九色| www亚洲色图| 精品久久在线播放| 精品国产99久久久久久宅男i| 亚洲免费av网址| 国产乱码在线| 成人欧美一区二区三区黑人孕妇 | 成人在线观看免费播放| 国产青春久久久国产毛片| 91欧美在线| www.国产区| av在线这里只有精品| 欧美丰满熟妇bbbbbb| 欧洲色大大久久| 日本v片在线免费观看| 久久久久久69| 久久久久久亚洲精品美女| 亚洲成人网上| 日一区二区三区| 亚洲av无码一区二区二三区| 亚洲国产欧美在线人成| 国产白浆在线观看| www.日本久久久久com.| 亚洲精品国产嫩草在线观看| 久久99精品久久久久久久青青日本| 欧美黄色一区| 992tv人人草| 亚洲欧洲精品天堂一级| 中文字幕精品一区二区精| 亚洲欧美中文字幕| sese综合| 欧美日本韩国一区二区三区| 国产精品久久久久久模特| 一边摸一边做爽的视频17国产| 亚洲最大色网站| www.热久久| 欧美国产第二页| 粉嫩久久久久久久极品| 国产美女永久无遮挡| 国产成人99久久亚洲综合精品| 亚洲熟女少妇一区二区| 欧美日韩高清一区| 日本蜜桃在线观看| 成人免费福利在线| 一区二区三区网站| 麻豆免费在线观看视频| 亚洲高清在线视频| 人妻一区二区三区免费| 2019最新中文字幕| 国产精品一区二区av交换| 中文字幕国产传媒| 国产精品久久久久久久久免费桃花 | 成人免费视频网站入口| 亚洲精选成人| 国精品无码人妻一区二区三区| 色综合久久久久综合体| 福利成人在线观看| 国产精品亚洲片夜色在线| 婷婷综合五月| 妖精视频一区二区| 色老汉av一区二区三区| 91精品国产91久久久久游泳池| 成人av电影天堂| 国产精品多人| 毛片网站免费观看| 欧美在线影院一区二区| 久久精品视频免费看| 国产精品美女xx| 丝袜美腿亚洲综合| 四虎精品免费视频| 亚洲福利在线播放| 快播电影网址老女人久久| 一区二区三区电影| 成人黄色777网| 波多野结衣一区二区在线| 久久精品国产一区| 精品福利一区| 高清一区在线观看| 亚洲一区视频在线| 国产在线一二三区| 亚洲一区二区三区xxx视频| 一本久久综合| www.av免费| 日韩精品一区二区三区第95| 日韩一区二区三区四区五区| 黄色大片中文字幕| 国产精品福利一区| 少妇av一区二区| 国产日韩视频在线观看| aa亚洲婷婷| 亚洲女人久久久| 亚洲精品有码在线| 亚洲综合色婷婷在线观看| 无码少妇一区二区三区芒果| 一区二区三区资源| 成人午夜在线观看视频| 国产乱码一区| 韩国三级中文字幕hd久久精品| 国产精品一区无码|