当前位置: 首页 > 编程日记 > 正文

深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路

摘要


众所周知,truncate table 是一种快速清空表内数据的一种方式,与 delete 方式不同,truncate 只产生非常少的 redo 和 undo,就实现了清空表数据并降低表 HWM 的功能。本文主要围绕 truncate table 的实现原理和 truncate table 的恢复来展开。

TRUNCATE 原理
环境准备

构造测试环境,通过 10046 以及 redo dump 去分析 truncate 的整个操作过程。
1) 10046 用于观察 truncate 对于字典基表的操作;
2) redo dump 用于观察 truncate 对于 segment header 以及 L1、L2 位图块的操作。

基于 ASSM 测试环境如下:

OS: redhat 6.5
db:11.2.0.4
segment&extent info:
SYS@:>select owner,segment_name,header_file,header_block from dba_segments where segment_name='TRUNCATE_TABLE' and owner='TEST';
OWNER                SEGMENT_NAME         HEADER_FILE     HEADER_BLOCK
-------------------- -------------------- ----------- ------------- ----------- ------------- ----------- ------
TEST                    TRUNCATE_TABLE                 5                              1898SYS@:>select extent_id,file_id,block_id,blocks from dba_extents where segment_name='TRUNCATE_TABLE' and owner='TEST' order by 1;
EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
0          5       1896          8
1          5      12104          8
2          5      12112          8
3          5      12120          8
4          5      12128          8
5          5      12136          8
6          5      12144          8
7          5      12152          8
8          5      11904          8
9          5      11912          8
10          5      11920          8
11          5      11928          8
12          5      11936          8
13          5      11944          8
14          5      11952          8
15          5      11960          8
16          5      16256        128
17          5      16384        128
18          5      16512        128
19          5      16768        128
20          5      22528        128
21          5      22656        128
22          5      22784        128
23          5      22912        128
24          5      23040        128
25          5      23168        128
26          5      23296        128
27          5      23424        128

truncate 对数据字典基表的操作

SYS@TEST(test):1>select count(*) from test.truncate_table;
COUNT(*)
----------
113426
SYS@:>alter system flush SHARED_POOL;
System altered.
SYS@:>alter system flush BUFFER_CACHE;
System altered.
SYS@:>alter system switch logfile;
System altered.
SYS@:>select * from v$log;
GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME         NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------ ------------ ------------------
1          1         85   52428800        512          1 NO  CURRENT                4116465 21-APR-18            2.8147E+14
2          1         83   52428800        512          1 NO  INACTIVE               4092314 20-APR-18               4116301 21-APR-18
3          1         84   52428800        512          1 NO  INACTIVE               4116301 21-APR-18               4116465 21-APR-18
SYS@:>oradebug setmypid;
Statement processed.
SYS@:>oradebug tracefile_name
/u01/app/oracle/diag/rdbms/test/test/trace/test_ora_7091.trc
SYS@:>oradebug event 10046 trace name context forever,level 12;
Statement processed.
SYS@:>truncate table test.truncate_table;
Table truncated.
SYS@:>oradebug event 10046 trace name context off;
Statement processed.
SYS@TEST(test):1>alter system dump logfile '/u01/app/oracle/oradata/test/redo01.log';
System altered.

从 10046 trace 里搜出对基表的 dml 操作:

update:
[root@prim1-11g ~]# grep -i "^update"  /u01/app/oracle/diag/rdbms/test/test/trace/test_ora_7091.trc
update obj$ set obj#=:4, type#=:5,ctime=:6,mtime=:7,stime=:8,status=:9,dataobj#=:10,flags=:11,oid$=:12,spare1=:13, spare2=:14 where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is null
update sys.mon_mods$ set inserts = inserts + :ins, updates = updates + :upd, deletes = deletes + :del, flags = (decode(bitand(flags, :flag), :flag, flags, flags + :flag)), drop_segments = drop_segments + :dropseg, timestamp = :time where obj# = :objn
update tab$ set ts#=:2,file#=:3,block#=:4,bobj#=decode(:5,0,null,:5),tab#=decode(:6,0,null,:6),intcols=:7,kernelcols=:8,clucols=decode(:9,0,null,:9),audit$=:10,flags=:11,pctfree$=:12,pctused$=:13,initrans=:14,maxtrans=:15,rowcnt=:16,blkcnt=:17,empcnt=:18,avgspc=:19,chncnt=:20,avgrln=:21,analyzetime=:22,samplesize=:23,cols=:24,property=:25,degree=decode(:26,1,null,:26),instances=decode(:27,1,null,:27),dataobj#=:28,avgspc_flb=:29,flbcnt=:30,trigflag=:31,spare1=:32,spare2=decode(:33,0,null,:33),spare4=:34,spare6=:35 where obj#=:1
update seg$ set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize=:9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, 65535, NULL, :13),groups=decode(:14, 65535, NULL, :14), cachehint=:15, hwmincr=:16, spare1=DECODE(:17,0,NULL,:17),scanhint=:18, bitmapranges=:19 where ts#=:1 and file#=:2 and block#=:3
delete:
[root@prim1-11g ~]# grep -i "^delete"  /u01/app/oracle/diag/rdbms/test/test/trace/test_ora_7091.trc
delete from superobj$ where subobj# = :1
delete from tab_stats$ where obj#=:1

通过上述跟踪,可以看到对基表的修改主要是:
1) 修改 obj$,tab$ 的 dataobj#
2) 修改 seg$ 的对应信息如(extents,blocks,hwmincr等等)
3) 删除 tab_stats$ 对应对象的统计信息

truncate 对元数据块的操作

对于 segment header 以及 L1、L2 位图块的操作,只能通过 redo dump 去观察。
为什么不使用 logminer 进行分析?

因为在 logminer 中只会记录数据块的变更,而对于 segment header 和 L1、L2 位图块的操作在 logminer 里只记录操作类型为 internal 或者 unsupported,没有什么有价值的信息。

通过对 redo dump 的分析,发现 truncate 操作只对 segment header,L2位图块,第一个 L1 位图块和 HWM block 所属的 L1 位图块进行了修改。

对于 segment header 的修改内容:
1) 修改块的 dataobj#
2) 修改 LHWM 和 HHWM
3) 修改 extent map、aux map 以及 extents 个数

对于 L2 位图块的修改内容:
1) 删除 L1 ranges
2) 修改L2块的dataobj#

对于第一个 L1 位图块的修改内容:
1) 修改第一个 L1 块的 dataobj#
2) set hwm 为 ext# 为 0 的第 3+1 个块(即段头块+1)

对于 HWM block 所属 L1 位图块的修改内容:
1) clear HWM flag

原理总结

truncate的实质是在不修改数据块的情况下,通过修改segment header的data_object_id,hwm,逐条清空 extent map,aux map 来实现清空表的目的,其中还涉及数据字典基表以及 L1、L2 位图块的修改,因此也可以说明 truncate 操作只是存储数据的数据块没有产生任何 redo 和 undo,但是 segment header,位图块,数据字典基表还是会产生 redo 和 undo。

TRUNCATE的恢复

本文的 truncate 恢复只针对于堆表 (非lob) 进行了测试,其实对于分区表和 lob 段的恢复原理是一样的。

根据之前对 truncate 原理的分析,truncate是不能通过闪回查询或者 logminer 的方式来恢复的,因为 truncate 操作不会对数据块进行任何操作,那么 truncate 应该如何恢复呢?下面列出几种常见的方法可供参考。
数据库闪回(要求 flashback database 开启,并且必要的闪回日志和归档日志不能丢失,因为闪回数据库不仅仅需要应用闪回日志,归档日志也是需要的)
异机恢复(要求有可用的备份以及必要的归档日志)
TSPITR(要求有可用的备份以及必要的归档日志)
特殊恢复工具恢复,如:odu(要求数据不被覆盖,如果数据被覆盖也可以最大程度的恢复数据)
通过修复元数据来实现恢复 truncate(要求有 truncate 操作时的 redo 信息,并且数据不被覆盖,如果数据被覆盖也可以最大程度的恢复数据)
其中数据库闪回和 TSPITR 对数据库影响较大。

最后两种方式可以在数据库 flashback database 没有开启,并且无备份的情况下进行恢复,但是这两种方式的技术难度大且容易制造出更大的麻烦,强烈建议不要轻易地在生产环境中进行尝试,最好还是请专业人士进行恢复(小编强行植入:云和恩墨 24h 等待各位召唤师召唤,如有紧急 case 直接在公众号任意一篇文章留言会立即帮忙联系公司专家对接,嘎嘎),本文只是为了演示最后这两种不常见的方法,重点介绍第二种修复元数据方式。

odu 的方式

odu 是 oracle 技术大咖 老熊(熊爷)开发的一款专业而且强大的 oracle 恢复工具,适用于所有场景下的恢复,具体功能介绍可以查看产品BLOG http://www.oracleodu.com/cn/。

odu 恢复 truncate 的原理是通过 scan 数据文件生成一份名为 ext.odu 的文件,该文件按照表的 dataobj# 扫描出具体的 extent 信息,然后通过 ext.odu 可以导出需要恢复的表的数据,最终再导入到数据库中,具体情况可以参看“利用 ODU 在 ASM 中恢复被 Truncate 掉的表的实例”(http://www.oracleodu.com/cn/recovery-truncated-table-in-asm-using-odu.html)

修复元数据的方式

重点介绍下通过修复元数据的方式来恢复 truncate table 的操作。

根据之前对 truncate 原理的分析,truncate 的实质是在不修改数据块的情况下,通过修改 segment header 的 data_object_id,hwm,逐条清空 extent map,aux map 等信息来实现清空表的目的,其中还涉及数据字典基表以及 L1、L2 位图块的修改,那么对于通过修改元数据的方式去恢复,大致思路如下:
确认需要恢复的数据字典基表和元数据块以及内容
确认truncate释放的空间是否被覆盖
根据前两点的分析开始进行恢复

第一个问题:如何确认哪些元数据块和数据字典是需要恢复的?
通过 10046 的跟踪发现(需要 flush shared pool 和 buffer cache),全表扫描查询或者是通过 rowid 去查询一定会访问 segment header,但是不会去访问任何 L1、L2 位图块,访问的数据字典基表包括:
user$、obj$、tab$、
tab_stats$、ts$、seg$、
ind$、ind_stats$、col$、
objauth$、cdef$、histgrm$、
hist_head$

这里重点关注之前通过 10046 跟踪 truncate 操作有更改的基表 obj$、tab$、seg$、tab_stats$ (统计信息不用管),其中 seg$ 经过测试只要 block#,file#,ts#(其实就是 segment header 地址)不被更改就无需理会,且 truncate 操作并不会修改 seg$ 的 ts#、file#、block#,因为 segment header 地址不会改变,验证过程如下:

SYS@TEST(test):1>select obj#,dataobj# from obj$ where owner# in (select user# from user$ where name='TEST') and name='T1';
OBJ#   DATAOBJ#
---------- ----------
17284      17284
SYS@TEST(test):1>select TS#,FILE#,BLOCK# from tab$ where OBJ#=17284;
TS#      FILE#     BLOCK#
---------- ---------- ----------
9          4        290
--修改 seg$ 的 blocks,extents,extsize,hwmincr 等信息
SYS@TEST(test):1>update seg$ set blocks=1,extents=1,minexts=1,maxexts=1,extsize=1,bitmapranges=1,hwmincr=1,type#=1 where ts#=9 and file#=4 and block#=290;
1 row updated.
SYS@TEST(test):1>commit;
Commit complete.
SYS@TEST(test):1>alter system flush shared_pool;
System altered.
--并不影响 t1 的查询
SYS@TEST(test):1>select count(*) from test.t1;
COUNT(*)
----------
14164
--删除或修改 ts#,file#,block#
SYS@TEST(test):1>delete from seg$ where ts#=9 and file#=4 and block#=290;
1 row deleted.
SYS@TEST(test):1>commit;
Commit complete.
SYS@TEST(test):1>select count(*) from test.t1;
select count(*) from test.t1
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [ktsircinfo_num1], [9], [4], [290], [], [], [], [], [], [], [], []

所以需要恢复的元数据块和数据字典基表以及内容为:

segment header(dataobj#、LHWM、HHWM、extent map、aux map以及extents个数)
tab$(dataobj#)
obj$(dataobj#)

下面提供 segment header 的信息对应的 offset:

segment header dump:
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0      spare2: 0      #extents: 28     #blocks: 1664
last map  0x00000000  #maps: 0      offset: 2716
Highwater::  0x01405b83  ext#: 27     blk#: 3      ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 1539
mapblk  0x00000000  offset: 27
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater::  0x01405b83  ext#: 27     blk#: 3      ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 1539
mapblk  0x00000000  offset: 27
Level 1 BMB for High HWM block: 0x01405b80
Level 1 BMB for Low HWM block: 0x01405b80
--------------------------------------------------------
Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0
L2 Array start offset:  0x00001434
First Level 3 BMB:  0x00000000
L2 Hint for inserts:  0x01400769
Last Level 1 BMB:  0x01405b81
Last Level II BMB:  0x01400769
Last Level III BMB:  0x00000000
Map Header:: next  0x00000000  #extents: 28   obj#: 16840  flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x01400768  length: 8
0x01402f48  length: 8
0x01402f50  length: 8
0x01402f58  length: 8
0x01402f60  length: 8
0x01402f68  length: 8
0x01402f70  length: 8
0x01402f78  length: 8
0x01402e80  length: 8
0x01402e88  length: 8
0x01402e90  length: 8
0x01402e98  length: 8
0x01402ea0  length: 8
0x01402ea8  length: 8
0x01402eb0  length: 8
0x01402eb8  length: 8
0x01403f80  length: 128
0x01404000  length: 128
0x01404080  length: 128
0x01404180  length: 128
0x01405800  length: 128
0x01405880  length: 128
0x01405900  length: 128
0x01405980  length: 128
0x01405a00  length: 128
0x01405a80  length: 128
0x01405b00  length: 128
0x01405b80  length: 128
Auxillary Map
--------------------------------------------------------
Extent 0     :  L1 dba:  0x01400768 Data dba:  0x0140076b
Extent 1     :  L1 dba:  0x01400768 Data dba:  0x01402f48
Extent 2     :  L1 dba:  0x01402f50 Data dba:  0x01402f51
Extent 3     :  L1 dba:  0x01402f50 Data dba:  0x01402f58
Extent 4     :  L1 dba:  0x01402f60 Data dba:  0x01402f61
Extent 5     :  L1 dba:  0x01402f60 Data dba:  0x01402f68
Extent 6     :  L1 dba:  0x01402f70 Data dba:  0x01402f71
Extent 7     :  L1 dba:  0x01402f70 Data dba:  0x01402f78
Extent 8     :  L1 dba:  0x01402e80 Data dba:  0x01402e81
Extent 9     :  L1 dba:  0x01402e80 Data dba:  0x01402e88
Extent 10    :  L1 dba:  0x01402e90 Data dba:  0x01402e91
Extent 11    :  L1 dba:  0x01402e90 Data dba:  0x01402e98
Extent 12    :  L1 dba:  0x01402ea0 Data dba:  0x01402ea1
Extent 13    :  L1 dba:  0x01402ea0 Data dba:  0x01402ea8
Extent 14    :  L1 dba:  0x01402eb0 Data dba:  0x01402eb1
Extent 15    :  L1 dba:  0x01402eb0 Data dba:  0x01402eb8
Extent 16    :  L1 dba:  0x01403f80 Data dba:  0x01403f82
Extent 17    :  L1 dba:  0x01404000 Data dba:  0x01404002
Extent 18    :  L1 dba:  0x01404080 Data dba:  0x01404082
Extent 19    :  L1 dba:  0x01404180 Data dba:  0x01404182
Extent 20    :  L1 dba:  0x01405800 Data dba:  0x01405802
Extent 21    :  L1 dba:  0x01405880 Data dba:  0x01405882
Extent 22    :  L1 dba:  0x01405900 Data dba:  0x01405902
Extent 23    :  L1 dba:  0x01405980 Data dba:  0x01405982
Extent 24    :  L1 dba:  0x01405a00 Data dba:  0x01405a02
Extent 25    :  L1 dba:  0x01405a80 Data dba:  0x01405a82
Extent 26    :  L1 dba:  0x01405b00 Data dba:  0x01405b02
Extent 27    :  L1 dba:  0x01405b80 Data dba:  0x01405b82
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1:   0x01400769

第二个问题:如何确认 truncate 释放的空间是否被覆盖,被哪些对象覆盖?
依据是用从 redo dump 找到的 truncate 前的 extent map 和 dba_extents 对比。如果有对象占用需要先 move 对象到其他表空间。如何从 redo dump 找到 extent map 请见后续段头块的 extent map 恢复。

具体恢复验证,请期待下一操作文章。

原文发布时间为:2018-08-02
本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章:

Linux exec与重定向

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。 bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如se…

俄罗斯 Android 系统受限,或将转用 HarmonyOS!

整理 | 郑丽媛出品 | CSDN近一个月来,受当前局势影响,部分底层工具、基础软件、开源项目已相继宣布在俄罗斯停服,期间不少人因此担忧:同出自美国且占据极大智能手机市场的 Android 和 iOS 是否会趁机“作乱”?结果&…

Ios应用网络安全之https

戴维营教育原创文章,转载请注明出处。我们的梦想是做最好的iOS开发培训!iOS应用网络安全之HTTPS1. HTTPS/SSL的基本原理安全套接字层 (Secure Socket Layer, SSL) 是用来实现互联网安全通信的最普遍的标准。Web 应用程序使用 HTTPS(基于 SSL …

云原生应用的10大关键属性

2019独角兽企业重金招聘Python工程师标准>>> “云原生”是用于描述基于容器的环境的术语,而Kubernetes是一个运行云原生应用程序工作负载的理想平台。 开发人员在设计云原生应用程序时,一定要牢记本文内这10个关键属性! “云原生&…

grep 正则表达式及选项以及注意

说明:在原文基础上稍作了修改grep命令简介: 在ex编辑器(我没用过)中,启动ex编辑器后要查找某个字符串时,在ex的命令提示符后键入::/pattern/p:/g/pattern/pgrep这个名字就由来如此。其中p的含义是print&…

iOS_25彩票_幸运转盘

终于效果图: 各个view的关系图: 背景圆盘(须要扣图处理)LuckyBaseBackground.png 盖在背景圆盘上面的转盘 LuckyRotateWheel.png 代表一个星座或生肖的button背景图片 要创建12个,并以最下方中点为锚点进行旋转 对背景圆盘进行扣图,并在其上面盖上转盘图片的核心代码 在自己定义…

Python 自动化办公之 Excel 对比工具

作者 | 周萝卜来源丨萝卜大杂烩今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍!需求由于工作当中经常需要对比前后两个 Excel 文件&am…

jQuery简单实现iframe的高度根据页面内容自适应的方法(转)

本文实例讲述了jQuery简单实现iframe的高度根据页面内容自适应的方法。分享给大家供大家参考,具体如下:方式1://注意:下面的代码是放在和iframe同一个页面中调用 $("#iframeId").load(function () {var mainheight $(t…

linux wc 命令简介

此wc命令不是让大家没有食欲的地方。而是linux下一个简单的小命令。NAMEwc — word, line, character, and byte countSYNOPSISwc [-clmw] [file ...]下面让我们来简单的看一下其支持的参数及其代表的含义。 参数及含义 参数含义-c显示文件的Bytes数(字节数)-l将每个文件的行数…

这个插件竟打通了Python和Excel,还能自动生成代码!

作者 | 云朵君来源丨数据STUDIO加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码?没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用Excel一样简单:介绍以…

集合list set Map问题

2019独角兽企业重金招聘Python工程师标准>>> ####集合list set Map的个人理解 首先集合说的对一类数据的存储容器,对象都是引用类型并不是基本数据类型 collection 接口 list和set都需实现它 collections 抽象了一些集合的基本功能,reverse s…

python学习第四课

#!/user/bin/env python#-*-coding:utf-8-*-# 一、字符串魔法# (1).isalpha()是否是字母或汉字。# 例:# a"张san22"# b"张三lisi"# va.isalpha()# v1b.isalpha()# print(v)# print(v1)# 因为a里含有数字,结果…

PHP 截取字符串专题

1. 截取GB2312中文字符串<?php< ?php//截取中文字符串functionmysubstr($str, $start, $len){$tmpstr ""; $strlen $start $len; for($i 0; $i< $strlen; $i){if(ord(substr($str, $i, 1))> 0xa0){$tmpstr. substr($str, $i, 2); $i; }else$tm…

​GPT-3好“搭档”:这种方法缓解模型退化,让输出更自然

作者 | LZM来源丨数据实战派文本生成对于许多自然语言处理应用来说都是非常重要的。但神经语言模型的基于最大化的解码方法&#xff08;如 beam search&#xff09;往往导致退化解&#xff0c;即生成的文本是不自然的&#xff0c;并且常常包含不必要的重复。现有的方法通过采样…

(Question)CSS中position的绝对定位问题

RT,绝对定位相对于定位的元素存在是哪里&#xff1f; https://yunpan.cn/crjSMTiak2srZ 访问密码 1570转载于:https://www.cnblogs.com/LiuChunfu/p/5139958.html

BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

题目描述 Bob有一棵 nn 个点的有根树&#xff0c;其中1号点是根节点。Bob在每个点上涂了颜色&#xff0c;并且每个点上的颜色不同。 定义一条路径的权值是&#xff1a;这条路径上的点&#xff08;包括起点和终点&#xff09;共有多少种不同的颜色。 Bob可能会进行这几种操作&am…

ls -l |wc -l命令多统计一行

#ls -l |wc -l注意&#xff1a;总用量也占用1行&#xff0c;所以统计出来的是14而不是13其他网友提醒 #ls -l |wc -l 就统计实际的行&#xff0c;放大就看出效果1和l不同

驱动数字经济加速,摩尔线程发布全新元计算架构MUSA和GPU产品

2022年3月30日&#xff0c;北京——摩尔线程今天举行主题为“元动力 创无限”的春季发布会。摩尔线程创始人兼CEO张建中解读了“元计算”这一产业趋势&#xff0c;并发布全新架构及系列重磅新品&#xff0c;包括&#xff1a;MUSA&#xff08;Moore Threads Unified System Arch…

HDU 4869 Turn the pokers(思维+组合公式+高速幂)

Turn the pokers 大意&#xff1a;给出n次操作&#xff0c;给出m个扑克。然后给出n个操作的个数a[i]&#xff0c;每一个a[i]代表能够翻的扑克的个数&#xff0c;求最后可能出现的扑克的组合情况。Hint Sample Input&#xff1a; 3 3 3 2 3 For the this example: 0 express fac…

马云打响本地生活消费攻坚战,饿了么获手淘一级入口,美团危险了

8月2日&#xff0c;细心的网友可以发现&#xff0c;手机淘宝App首页已上线“饿了么外卖”&#xff0c;饿了么成为手机淘宝首页的10个默认入口之一。这也就意味着以后手机淘宝用户可以通过淘宝首页新入口进入外卖服务&#xff0c;在应用内直接完成由饿了么提供的订餐外卖服务。 …

Linux文件,文件描述符以及dup()和dup2()

一.Linux中文件 可以分为4种&#xff1a;普通文件、目录文件、链接文件和设备文件。1、普通文件是用户日常使用最多的文件&#xff0c;包括文本文件、shell脚本、二进制的可执行和各种类型的数据。ls -lh 来查看某个文件的属性&#xff0c;可以看到有类似 -rw-r--r-- &#xff…

摩尔线程推出首款数据中心级全栈功能GPU:MTT S2000

2022年3月30日&#xff0c;北京——摩尔线程正式推出首款基于其先进架构MUSA统一系统架构&#xff08;Moore Threads Unified System Architecture&#xff09;打造的数据中心级多功能GPU产品MTT S2000。摩尔线程MTT S2000基于其第一代MUSA架构GPU芯片苏堤研发制成&#xff0c;…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中&#xff0c;jQuery.html() 是获取当前节点下的html代码&#xff0c;并不包含当前节点本身的代码&#xff0c;然后我们有时候确需要&#xff0c;找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html()&#xff0c;如果当前元素没有兄弟元素还…

修改CentOS yum源

解决在CentOS yum源下载慢的办法最近在虚拟机下面安装了个CentOS 5.5&#xff0c;使用yum更新时发现下载速度异常慢。可以修改yum的配置文件&#xff0c;把其镜像指向国内的服务器即可。 方案一&#xff1a; # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo.b…

带monkey的测流量!

为什么80%的码农都做不了架构师&#xff1f;>>> //public static void flow(){ //String command1 "adb shell monkey -p com.netease.newsreader.activity -s 500 -v 2000"; //String command2 "adb shell ps"; //String str"com.nete…

实现AI技术自立自强,国产深度学习框架面临三大难题

作为推动AI应用大规模落地的关键力量&#xff0c;深度学习框架的重要性日益凸显。它不仅关系国计民生的行业和领域广泛的应用&#xff0c;同样也对信息系统的科技安全有着决定性的意义。 “深度学习框架在人工智能技术体系中&#xff0c;处于贯通上下的腰部位置&#xff0c;它下…

关于Android H5混合开发遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> 添加WebChromeClient&#xff0c;复写onJsAlert、onJsConfirm、onJsPrompt方法后&#xff0c;弹框异常退出问题 项目经理说&#xff0c;Android没有处理弹框&#xff0c;点击按钮没有反应&#xff0c;iOS就可以。于是就复…

手动配置lnmp环境

做php开发的&#xff0c;想要进一步提升自己&#xff0c;手动搭建开发环境&#xff0c;我想是必须经历的一个坎。虽然说有很多第三方集成环境可供使用&#xff0c;但我想说的是在你没有自己搭建过一次环境的时候&#xff0c;你没有太多的资本去“偷懒”。虽然我自己也是个菜鸟&…

负载均衡,会话保持,session同步

一&#xff0c;什么负载均衡一个新网站是不要做负载均衡的&#xff0c;因为访问量不大&#xff0c;流量也不大&#xff0c;所以没有必要搞这些东西。但是随着网站访问量和流量的快速增长&#xff0c;单台服务器受自身硬件条件的限制&#xff0c;很难承受这么大的访问量。在这种…

终于“打造”出了一个可以随时随地编程的工具

作者 | 老表来源丨简说Python分享概要 系统&#xff1a;阿里云ECS共享型n4服务器 1核2g 存储50g&#xff08;双十一便宜买的&#xff0c;180元/3年&#xff09;环境&#xff1a;自带python3.6.8 方便演示&#xff0c;直接使用它开始动手动脑 首先我们需要连接上服务器&#xff…