主頁 > 資料庫 > 一次元資料空間記憶體溢位的排查記錄

一次元資料空間記憶體溢位的排查記錄

2023-07-12 08:53:15 資料庫

在應用中,我們使用的 SpringData ES的 ElasticsearchRestTemplate來做查詢,使用方式不對,導致每次ES查詢時都新實體化了一個查詢物件,會加載相關類到元資料中,最終長時間運行后元資料出現記憶體溢位;

問題原因:類加載過多,導致元資料OOM,非類實體多或者大物件問題;

排查方式:

查看JVM運行情況,發現元資料滿導致記憶體溢位;
匯出記憶體快照,通過OQL快速定位肇事者;
排查對應類的使用場景和加載場景(重點序列化反射場景);

起源

06-15 下午正摩肩擦掌的備戰著晚上8點,收到預發機器的一個GC次數報警,


【警告】UMP JVM監控
【警告】異步(async采集點:async.jvm.info(別名:jvm監控)15:42:40至15:42:50【xx.xx.xx.xxx(10174422426)(未知分組)】,JVM監控FullGC次數=2次[偏差0%],超過1次FullGC次數>=2次
【時間】2023-06-15 15:42:50
【型別】UMP JVM監控

第一時間詫異了下,該應用主要作用是接MQ訊息和定時任務,同時任務和MQ都和線上做了隔離,也沒有收到大流量的告警,

先看了下對應JVM監控:

只看上面都懷疑是監控例外(之前用檔案采集的時候有遇到過,看CPU確實有波動,但堆基本無漲幅,懷疑非堆,)

問題排查

定位分析

既然懷疑非堆,我們先通過 jstat來看看情況

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00   0.89   3.67  97.49  97.96    854   23.720   958  615.300  639.020
  0.00   0.00   0.89   3.67  97.49  97.96    854   23.720   958  615.300  639.020
  0.00   0.00   0.89   3.67  97.49  97.96    854   23.720   958  615.300  639.020
  0.00   0.00   0.89   3.67  97.49  97.96    854   23.720   958  615.300  639.020
  0.00   0.00   0.89   3.67  97.49  97.96    854   23.720   958  615.300  639.020

M列代表了metaspace的使用率,當前已經 97.49% 進一步印證了我們的猜測,

接下來通過 jmap 匯出記憶體快照分析,這里我習慣使用 Visual VM 進行分析,

在這里我們看到有 118588 個類被加載了,正常業務下不會有這么多類,

這里我們走了很多彎路,

首先查看記憶體物件,根據類的實體數排了個序,試圖看看是否是某個或某些類實體過多導致,

這里一般是排查堆例外時使用,可以看大物件和某類的實體數,但我們的問題是類加載過多,非類實體物件多或者大,這里排除,

后續還嘗試了直接使用 Visual VM 的聚合按包路徑統計,同時排序,收效都甚微,看不出啥例外來,

這里我們使用 OQL 來進行查詢統計,

陳述句如下:

var packageClassSizeMap = {};
// 遍歷統計以最后一個逗號做分割
heap.forEachClass(function (it) {
    var packageName = it.name.substring(0, it.name.lastIndexOf('.'));
    if (packageClassSizeMap[packageName] != null) {
        packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1;
    } else {
        packageClassSizeMap[packageName] = 1;
    }
});
// 排序 因為Visual VM的查詢有數量限制,
var sortPackageClassSizeMap = [];
map(sort(Object.keys(packageClassSizeMap), function (a, b) {
    return packageClassSizeMap[b] - packageClassSizeMap[a]
}), function (it) {
    sortPackageClassSizeMap.push({
        package: it,
        classSize: packageClassSizeMap[it]
    })
});
sortPackageClassSizeMap;

執行效果如下:

可以看到,com.jd.bapp.match.sync.query.es.po 下存在 92172 個類,這個包下,不到20個類,這時我們在回到開始查看類的地方,看看該路徑下都是些什么類,

這里附帶一提,直接根據路徑獲取對應的類數量:

var packageClassSizeMap = {};
// 遍歷統計以最后一個逗號做分割
heap.forEachClass(function (it) {
    var packageName = it.name.substring(0, it.name.lastIndexOf('.'));
    // 加路徑過濾版
    if (packageName.indexOf('com.jd.bapp.match.sync.query.es.po')){
        if (packageClassSizeMap[packageName] != null) {
            packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1;
        } else {
            packageClassSizeMap[packageName] = 1;
        }
    }
});

sortPackageClassSizeMap;

查詢 com.jd.bapp.match.sync.query.es.po 路徑下的classes

我們可以看到:

  • 每個ES的Po物件存在大量類加載,在后面有拼接Instantiator_xxxxx
  • 部分類有實體,部分類無實體,(count為實體數)

從上面得到的資訊得出是ES相關查詢時出現的,我們本地debug查詢跟蹤下,

抽絲剝繭

這里列下主要排查流程

在應用中,我們使用的 SpringData ES的 ElasticsearchRestTemplate來做查詢,主要使用方法 org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate#search

重點代碼如下:

public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) {
    // 初始化request
    SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index);
    // 獲取值
    SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT));
  
    SearchDocumentResponseCallback<SearchHits<T>> callback = new ReadSearchDocumentResponseCallback<>(clazz, index);
    // 轉換為對應型別
    return callback.doWith(SearchDocumentResponse.from(response));
}

加載

首先看初始化request的邏輯

  • org.springframework.data.elasticsearch.core.RequestFactory#searchRequest

    • 首先是: org.springframework.data.elasticsearch.core.RequestFactory#prepareSearchRequest

      • 這里有段代碼是對搜索結果的排序處理: prepareSort(query, sourceBuilder, getPersistentEntity(clazz)); 重點就是這里的 getPersistentEntity(clazz)
        這段代碼主要會識別當前類是否已經加載過,沒有加載過則加載到記憶體中:

        @Nullable
        private ElasticsearchPersistentEntity<?> getPersistentEntity(@Nullable Class<?> clazz) {
        	// 從convert背景關系中獲取判斷該類是否已經加載過,如果沒有加載過,就會重新決議加載并放入背景關系
        	return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null;
        }
        

具體加載的實作見: 具體實作見:org.springframework.data.mapping.context.AbstractMappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation<?>)

	/*
	 * (non-Javadoc)
	 * @see org.springframework.data.mapping.model.MappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation)
	 */
	@Nullable
	@Override
	public E getPersistentEntity(TypeInformation<?> type) {

		Assert.notNull(type, "Type must not be null!");

		try {
			read.lock();
			// 從背景關系獲取當前類
			Optional<E> entity = persistentEntities.get(type);
			// 存在則回傳
			if (entity != null) {
				return entity.orElse(null);
			}
		} finally {
			read.unlock();
		}
		if (!shouldCreatePersistentEntityFor(type)) {
			try {
				write.lock();
				persistentEntities.put(type, NONE);
			} finally {
				write.unlock();
			}
			return null;
		}
		if (strict) {
			throw new MappingException("Unknown persistent entity " + type);
		}
		// 不存在時,添加該型別到背景關系
		return addPersistentEntity(type).orElse(null);
	}

使用

上述是加載流程,執行查詢后,我們還需要進行一次轉換,這里就到了使用的地方:org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate#search中 callback.doWith(SearchDocumentResponse.from(response));

這里這個方法會請求內部的 doWith 方法,實作如下:

@Nullable
public T doWith(@Nullable Document document) {

    if (document == null) {
        return null;
    }
    // 獲取到待轉換的類實體
    T entity = reader.read(type, document);
    return maybeCallbackAfterConvert(entity, document, index);
}

其中的 reader.read 會先從背景關系中獲取上述加載到背景關系的類資訊,然后讀取

	@Override
	public <R> R read(Class<R> type, Document source) {
		TypeInformation<R> typeHint = ClassTypeInformation.from((Class<R>) ClassUtils.getUserClass(type));
		typeHint = (TypeInformation<R>) typeMapper.readType(source, typeHint);

		if (conversions.hasCustomReadTarget(Map.class, typeHint.getType())) {
			R converted = conversionService.convert(source, typeHint.getType());
			if (converted == null) {
				// EntityReader.read is defined as non nullable , so we cannot return null
				throw new ConversionException("conversion service to type " + typeHint.getType().getName() + " returned null");
			}
			return converted;
		}

		if (typeHint.isMap() || ClassTypeInformation.OBJECT.equals(typeHint)) {
			return (R) source;
		}
		// 從背景關系獲取之前加載的類
		ElasticsearchPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(typeHint);
		// 獲取該類資訊
		return readEntity(entity, source);
	}

讀取會走 org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter#readEntity

先是讀取該類的初始化器:EntityInstantiator instantiator = instantiators.getInstantiatorFor(targetEntity);

  • 是通過該類實作:org.springframework.data.convert.KotlinClassGeneratingEntityInstantiator#createInstance

    • 然后到:org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator#doCreateEntityInstantiator
	/*
	 * (non-Javadoc)
	 * @see org.springframework.data.convert.ClassGeneratingEntityInstantiator#doCreateEntityInstantiator(org.springframework.data.mapping.PersistentEntity)
	 */
	@Override
	protected EntityInstantiator doCreateEntityInstantiator(PersistentEntity<?, ?> entity) {

		PreferredConstructor<?, ?> constructor = entity.getPersistenceConstructor();

		if (ReflectionUtils.isSupportedKotlinClass(entity.getType()) && constructor != null) {

			PreferredConstructor<?, ?> defaultConstructor = new DefaultingKotlinConstructorResolver(entity)
					.getDefaultConstructor();

			if (defaultConstructor != null) {
				// 獲取物件初始化器
				ObjectInstantiator instantiator = createObjectInstantiator(entity, defaultConstructor);

				return new DefaultingKotlinClassInstantiatorAdapter(instantiator, constructor);
			}
		}

		return super.doCreateEntityInstantiator(entity);
	}

這里先請求內部的:createObjectInstantiator

	/**
	 * Creates a dynamically generated {@link ObjectInstantiator} for the given {@link PersistentEntity} and
	 * {@link PreferredConstructor}. There will always be exactly one {@link ObjectInstantiator} instance per
	 * {@link PersistentEntity}.
	 *
	 * @param entity
	 * @param constructor
	 * @return
	 */
	ObjectInstantiator createObjectInstantiator(PersistentEntity<?, ?> entity,
			@Nullable PreferredConstructor<?, ?> constructor) {

		try {
			// 呼叫生成
			return (ObjectInstantiator) this.generator.generateCustomInstantiatorClass(entity, constructor).newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

獲取物件生成實體:generateCustomInstantiatorClass 這里獲取類名稱,會追加 _Instantiator_和對應類的 hashCode


		/**
		 * Generate a new class for the given {@link PersistentEntity}.
		 *
		 * @param entity
		 * @param constructor
		 * @return
		 */
		public Class<?> generateCustomInstantiatorClass(PersistentEntity<?, ?> entity,
				@Nullable PreferredConstructor<?, ?> constructor) {
			// 獲取類名稱
			String className = generateClassName(entity);
			byte[] bytecode = generateBytecode(className, entity, constructor);

			Class<?> type = entity.getType();

			try {
				return ReflectUtils.defineClass(className, bytecode, type.getClassLoader(), type.getProtectionDomain(), type);
			} catch (Exception e) {
				throw new IllegalStateException(e);
			}
		}

		private static final String TAG = "_Instantiator_";

		/**
		 * @param entity
		 * @return
		 */
		private String generateClassName(PersistentEntity<?, ?> entity) {
			// 類名+TAG+hashCode
			return entity.getType().getName() + TAG + Integer.toString(entity.hashCode(), 36);
		}

到此我們元資料中的一堆 拼接了 Instantiator_xxxxx 的類來源就破案了,

真相大白

對應問題產生的問題也很簡單,

// 每次search前 都new了個RestTemplate,導致背景關系發生變化,每次重新生成加載
new ElasticsearchRestTemplate(cluster);

這里我們是雙集群模式,每次請求時會由負載決定使用那一個集群,之前在這里每次都 new了一個待使用集群的實體,

內部的背景關系每次初始化后都是空的,

  • 請求查詢ES

    • 初始化ES查詢

      • 背景關系為空
      • 加載類資訊(hashCode發生變化)
      • 獲取類資訊(重計算類名)
      • 重新加載類到元資料

最終長時間運行后元資料空間溢位;

事后結論

1.當時的臨時方案是重啟應用,元資料區清空,同時臨時也可以放大元資料區大小,

2.元資料區的型別卸載或回收,8以后已經不使用了,

3.元資料區的泄漏排查思路:找到加載多的類,然后排查使用情況和可能的加載場景,一般在各種序列化反射場景,

4.快速排查可使用我們的方案,使用OQL來完成,

5.監控可以考慮加載類實體監控和元資料空間使用大小監控和對應報警,可以提前發現和處理,

6.ES查詢在啟動時對應集群內部初始化一個查詢實體,使用那個集群就使用對應的集群查詢實體,

附錄

VisualVM下載地址:https://visualvm.github.io/

OQL: Object Query Language 可參看在VisualVM中使用OQL分析

獲取路徑下類加載數量,從高到低排序

var packageClassSizeMap = {};
// 遍歷統計以最后一個逗號做分割
heap.forEachClass(function (it) {
    var packageName = it.name.substring(0, it.name.lastIndexOf('.'));
    if (packageClassSizeMap[packageName] != null) {
        packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1;
    } else {
        packageClassSizeMap[packageName] = 1;
    }
});
// 排序 因為Visual VM的查詢有數量限制,
var sortPackageClassSizeMap = [];
map(sort(Object.keys(packageClassSizeMap), function (a, b) {
    return packageClassSizeMap[b] - packageClassSizeMap[a]
}), function (it) {
    sortPackageClassSizeMap.push({
        package: it,
        classSize: packageClassSizeMap[it]
    })
});
sortPackageClassSizeMap;

獲取某個路徑下類加載數量

var packageClassSizeMap = {};
// 遍歷統計以最后一個逗號做分割
heap.forEachClass(function (it) {
    var packageName = it.name.substring(0, it.name.lastIndexOf('.'));
    // 加路徑過濾版
    if (packageName.indexOf('com.jd.bapp.match.sync.query.es.po')){
        if (packageClassSizeMap[packageName] != null) {
            packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1;
        } else {
            packageClassSizeMap[packageName] = 1;
        }
    }
});

sortPackageClassSizeMap;

特別鳴謝

感謝黃仕清和Jdos同學提供的技術支持,

作者:京東零售 王建波

來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/557079.html

標籤:其他

上一篇:Windows下SqlServer2008通過ODBC連接到DM資料庫安裝部署

下一篇:返回列表

標籤雲
其他(162427) Python(38274) JavaScript(25531) Java(18294) C(15239) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7296) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4615) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1998) .NET技术(1986) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1883) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 一次元資料空間記憶體溢位的排查記錄

    在應用中,我們使用的 SpringData ES的 ElasticsearchRestTemplate來做查詢,使用方式不對,導致每次ES查詢時都新實體化了一個查詢物件,會加載相關類到元資料中。最終長時間運行后元資料出現記憶體溢位; ......

    uj5u.com 2023-07-12 08:53:15 more
  • Windows下SqlServer2008通過ODBC連接到DM資料庫安裝部署

    1 環境說明作業系統:Windows Server 2008資料庫版本:SQL Server 2008 10.50.1600.1 2 搭建程序2.1 達夢資料庫軟體下載進入達夢官網 https://www.dameng.com/ 選擇X86,win64,點擊下載。 2.2 安裝資料庫解壓下載后檔案, ......

    uj5u.com 2023-07-12 08:52:30 more
  • es筆記四之中文分詞插件安裝與使用

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記四之中文分詞插件安裝與使用](https://mp.weixin.qq.com/s/aQuwrUzLZDKLv_K8dKeVzw) 前面我們介紹的操作及演示都是基于英語單詞的分詞,但我們大部分使用的肯定都是中文,所以如果需要使用分詞的操 ......

    uj5u.com 2023-07-12 08:52:06 more
  • 三問三答:細數GaussDB遷移的核心技術

    摘要:本文從客戶視角的三個疑問出發,一起了解華為云GaussDB資料庫的遷移解決方案具有哪些核心技術,如何做到讓客戶遷移程序安心、放心、省心。 遷移是資料庫選型程序中客戶最為關心的話題之一,經過大量的溝通調研,我們總結客戶在資料庫遷移方面的主要期望:遷移不影響業務運行(安心)、遷移不能丟資料(放心) ......

    uj5u.com 2023-07-12 08:52:00 more
  • 向量資料庫Faiss的搭建與使用

    向量資料庫Faiss是Facebook AI研究院開發的一種高效的相似性搜索和聚類的庫。它能夠快速處理大規模資料,并且支持在高維空間中進行相似性搜索。本文將介紹如何搭建Faiss環境并提供一個簡單的使用示例。 ......

    uj5u.com 2023-07-12 08:51:54 more
  • 一次元資料空間記憶體溢位的排查記錄

    在應用中,我們使用的 SpringData ES的 ElasticsearchRestTemplate來做查詢,使用方式不對,導致每次ES查詢時都新實體化了一個查詢物件,會加載相關類到元資料中。最終長時間運行后元資料出現記憶體溢位; ......

    uj5u.com 2023-07-12 08:51:49 more
  • postgresql序列重復問題處理

    ## 問題 在執行資料插入時,postgresql 提示*more than one owned sequence found*錯誤。這個和之前文章中寫的[序列編號錯亂](https://www.cnblogs.com/podolski/p/17349217.html)不同,是由資料表的一個列生成了 ......

    uj5u.com 2023-07-12 08:51:37 more
  • 選讀SQL經典實體筆記05_日期運算(下)

    ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230711143234011-1452662689.png) # 1. 兩個日期之間相差的月份和年份 ## 1.1. DB2 ## 1.2. MySQL ## 1.3. sq ......

    uj5u.com 2023-07-12 08:51:19 more
  • MySQL 8.0 Dynamic Redo Log Sizing翻譯

    本文是MySQL 8.0 Dynamic Redo Log Sizing[1]這篇文章的翻譯。如有翻譯不當的地方,敬請諒解,請尊重原創和翻譯勞動成果,轉載的時候請注明出處。謝謝! 這篇博文將討論MySQL 8.0.30中引入的最新功能/特性:重做日志動態調整大小(dynamic redo log s ......

    uj5u.com 2023-07-12 08:50:57 more
  • 【技識訓累】Mysql中的SQL語言【技術篇】【一】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-07-12 08:50:53 more