服務(wù)器
背景
有時(shí)候我們需要獲取文件的創(chuàng )建時(shí)間。
例如:
我在研究 《xtrabackup 原理圖》的時(shí)候,想通過(guò)觀(guān)察確認 xtrabackup_log 是最早創(chuàng )建 并且是 最晚保存的文件。我們就需要知道 xtrabackup_logfile 這個(gè)文件的創(chuàng )建時(shí)間戳和修改時(shí)間戳。
復習: Linux關(guān)于文件的三個(gè)時(shí)間戳
Linux 的文件系統保存有三個(gè)時(shí)間戳,利用 stat 指令查看文件信息可以獲取。他們分別是 ATime、MTime 和 CTime
[root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt\' Size: 16 Blocks: 8 IO Block: 4096 regular file Device: 821h/2081d Inode: 15 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-23 12:12:14.276981038 0800 Modify: 2019-07-23 12:12:41.415980158 0800 Change: 2019-07-23 12:12:41.415980158 0800 Birth: -
ATime ——文件的最近訪(fǎng)問(wèn)時(shí)間
只要讀取文件,ATime 就會(huì )更新,對應的是 stat 命令獲取的 Access 的值。
[root@192-168-199-198 backups]# cat 2.txt #<-- 讀取文件 121231233123123 [root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt\' Size: 16 Blocks: 8 IO Block: 4096 regular file Device: 821h/2081d Inode: 15 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-23 12:22:09.644961733 0800 #<-- 時(shí)間變化了 Modify: 2019-07-23 12:12:41.415980158 0800 Change: 2019-07-23 12:12:41.415980158 0800 Birth: -
MTime ——文件的內容最近修改的時(shí)間
當文件進(jìn)行被寫(xiě)的時(shí)候,CTime 就會(huì )更新,對應的是 stat 命令獲取的 Modify 的值。
[root@192-168-199-198 backups]# echo hello_world > 2.txt #<-- 修改文件內容 [root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt\' Size: 12 Blocks: 8 IO Block: 4096 regular file Device: 821h/2081d Inode: 15 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-23 12:22:09.644961733 0800 Modify: 2019-07-23 12:26:23.466953503 0800 #<-- 時(shí)間變化了 Change: 2019-07-23 12:26:23.466953503 0800 Birth: -
這里不要用vi修改文件內容,因為用vi修改文件內容有可能會(huì )引起Inode變更,也就是你觀(guān)察的文件并不是之前的文件了!這個(gè)和vi的原理有關(guān)。
CTime ——文件屬性最近修改的時(shí)間
當文件的目錄被修改,或者文件的所有者,權限等被修改時(shí),CTime 也就會(huì )更新,對應的是 stat 命令獲取的 Change 的值。
[root@192-168-199-198 backups]# chmod 777 2.txt #<-- 修改文件屬性 [root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt\' Size: 12 Blocks: 8 IO Block: 4096 regular file Device: 821h/2081d Inode: 15 Links: 1 Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-23 12:22:09.644961733 0800 Modify: 2019-07-23 12:26:23.466953503 0800 Change: 2019-07-23 12:30:35.830945320 0800 #<-- 時(shí)間變化了 Birth: -
Linux 無(wú)法獲取文件創(chuàng )建時(shí)間?
現在我們知道了Linux有三種時(shí)間,ATime、MTime 和 CTime,那么很好奇為什么沒(méi)有 CRTime (創(chuàng )建時(shí)間) 呢?
對比 Windows 系統 (上圖),Windows 的 NTFS 文件系統里存在三個(gè)時(shí)間戳,其中就包含了“創(chuàng )建時(shí)間”,但在 Linux 的設計哲學(xué)上沒(méi)有文件“創(chuàng )建時(shí)間”這么一說(shuō),所以早期版本的ext文件系統不支持文件“創(chuàng )建時(shí)間”。但從 ext4 版本開(kāi)始,文件創(chuàng )建時(shí)間存儲在ext4文件系統的inode中,所以 ext4 文件系統使用特殊方法也是可以獲取文件的創(chuàng )建時(shí)間的。
也說(shuō)明了,是否能獲取文件的創(chuàng )建時(shí)間,和文件系統是否支持有關(guān)。
Linux 上獲取文件創(chuàng )建時(shí)間的步驟
CentOS7 Linux系統自帶一個(gè)工具,叫做 debugfs,他可以查出 ext4 文件系統上的文件的創(chuàng )建時(shí)間。man debugfs 發(fā)現工具的描述是 “ext2/ext3/ext4 file system debugger”,所以他是不支持 xfs 文件系統的。
常用的 xfs 文件系統是否支持獲取文件創(chuàng )建時(shí)間,還有如何獲取,這個(gè)暫時(shí)不清楚,需讀者查閱官方文檔
1. 獲取文件的 inode 號
方法一:
[root@192-168-199-198 backups]# stat /backups/2.txt File: ‘/backups/2.txt\' Size: 30 Blocks: 8 IO Block: 4096 regular file Device: 821h/2081d Inode: 14 #<--- 這個(gè) Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-07-23 12:49:11.462909146 0800 Modify: 2019-07-23 12:49:11.462909146 0800 Change: 2019-07-23 13:08:20.138871900 0800 Birth: -
方法二:
[root@192-168-199-198 backups]# ls -i /backups/2.txt 14 /backups/2.txt
這里,我們獲取的 inode 編號是 14。
2. 查找文件所在磁盤(pán)路徑
[root@192-168-199-198 backups]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 46G 23G 24G 49% / devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.9G 8.0K 3.9G 1% /dev/shm tmpfs 3.9G 12M 3.8G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sdb1 100G 77G 24G 77% /data2 /dev/sdc1 50G 53M 47G 1% /backups #<--- 可以看出文件在這里面 /dev/sda1 1014M 142M 873M 14% /boot tmpfs 781M 0 781M 0% /run/user/0
磁盤(pán)路徑為 /dev/sdc1
3. 使用debugfs 查看文件創(chuàng )建時(shí)間
[root@192-168-199-198 backups]# debugfs -R \'stat <14>\' /dev/sdc1 debugfs 1.42.9 (28-Dec-2013) Inode: 14 Type: regular Mode: 0644 Flags: 0x80000 Generation: 737271740 Version: 0x00000000:00000001 User: 0 Group: 0 Size: 30 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5d369644:211c1170 -- Tue Jul 23 13:08:20 2019 atime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 mtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 crtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 Size of extra inode fields: 28 EXTENTS: (0):35337
獲取文件創(chuàng )建時(shí)間的腳本
鑒于獲取文件創(chuàng )建時(shí)間步驟操作有點(diǎn)麻煩 (雖然只有三步 :) )
我這里提供了一個(gè)腳本
vi statx #!/bin/sh [ $# -ne 1 ] && echo Usage: $0 {FILENAME} && exit 1 INODE=`ls -i $1 |awk \'{print $1}\'` FILENAME=$1 #如果傳入參數帶/,則獲取這個(gè)傳入參數的目錄路徑并進(jìn)入目錄 `echo $FILENAME |grep / 1> /dev/null` && { FPWD=${FILENAME%/*};FPWD=${F=/};cd ${FPWD};FPWD=`pwd`; } || FPWD=`pwd` array=(`echo ${FPWD} | sed \'s@/@ @g\'`) array_length=${#array[@]} for ((i=${array_length};i>=0;i--)) do unset array[$i] SUBPWD=`echo ${array[@]} | sed \'s@ @/@g\'` DISK=`df -h |grep ${SUBPWD}$ |awk \'{print $1}\'` [[ -n $DISK ]] && break done #不是ext4就退出 [[ `mount |grep ${DISK} |awk \'{print $5}\'` != ext4 ]] && { echo ${DISK} is not mount on type ext4! Only ext4 file system support!;exit 2; } debugfs -R stat <${INODE}> ${DISK}
使用:
chmod x statx mv statx /usr/sbin/statx [root@192-168-199-198 backups]# statx 2.txt debugfs 1.42.9 (28-Dec-2013) Inode: 14 Type: regular Mode: 0644 Flags: 0x80000 Generation: 737271740 Version: 0x00000000:00000001 User: 0 Group: 0 Size: 30 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5d369644:211c1170 -- Tue Jul 23 13:08:20 2019 atime: 0x5d36bb8f:56eb1e70 -- Tue Jul 23 15:47:27 2019 mtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 crtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 Size of extra inode fields: 28 EXTENTS: (0):35337
?。?!請謹慎在生產(chǎn)環(huán)境使用,shell腳本沒(méi)有做太多的異常處理,不支持管道,不支持目錄也沒(méi)有經(jīng)過(guò)大量的測試
實(shí)戰
我們回過(guò)頭來(lái),用這個(gè)方法,確認《xtrabackup 原理圖》是否準確。
我們需要驗證的是:
xtrabackup_log 是最早創(chuàng )建 并且是 最晚保存的文件
1. 創(chuàng )建備份
DATE=`date %Y%m%d%H%M%S` xtrabackup -uroot -proot \\ -S /tmp/mysql3306.sock \\ --backup \\ --target-dir=/backups/$DATE
2. 查找所有備份文件的crtime
cd /backups/$DATE >/tmp/1.txt >/tmp/2.txt find . -type f >/tmp/1.txt for i in `cat /tmp/1.txt` do { echo -n $i ;statx $i 2>/dev/null |grep crtime |awk \'{print $7}\'; } >>/tmp/2.txt done cat /tmp/2.txt |sort -k2 |less ###以下為輸出### ./ibdata1 23:32:59 ./xtrabackup_logfile 23:32:59 #<---可以看出這個(gè)文件是最早創(chuàng )建的 ./Mysql/engine_cost.ibd 23:33:00 ./MYSQL/gtid_executed.ibd 23:33:00 ./mysql/help_category.ibd 23:33:00 ./mysql/help_keyword.ibd 23:33:00 ./mysql/help_relation.ibd 23:33:00 ./mysql/help_topic.ibd 23:33:00 ./mysql/innodb_index_stats.ibd 23:33:00 ./mysql/innodb_table_stats.ibd 23:33:00 ./mysql/plugin.ibd 23:33:00 ./mysql/server_cost.ibd 23:33:00 ./mysql/servers.ibd 23:33:00 ./mysql/slave_master_info.ibd 23:33:00 ./mysql/slave_relay_log_info.ibd 23:33:00 ./mysql/slave_worker_info.ibd 23:33:00 ./mysql/time_zone.ibd 23:33:00 ./mysql/time_zone_leap_second.ibd 23:33:00 ... ./zabbix/trigger_tag.frm 23:33:09 ./zabbix/users.frm 23:33:09 ./zabbix/users_groups.frm 23:33:09 ./zabbix/usrgrp.frm 23:33:09 ./zabbix/valuemaps.frm 23:33:09 ./zabbix/widget_field.frm 23:33:09 ./zabbix/widget.frm 23:33:09
3. 查找所有備份文件的mtime
>/tmp/1.txt >/tmp/2.txt find . -type f >/tmp/1.txt for i in `cat /tmp/1.txt` do { echo -n $i ;statx $i 2>/dev/null |grep mtime |awk \'{print $7}\'; } >>/tmp/2.txt done cat /tmp/2.txt |sort -k2 |less ###以下為輸出### ./ibdata1 23:33:00 ./mysql/engine_cost.ibd 23:33:00 ./mysql/gtid_executed.ibd 23:33:00 ./mysql/help_category.ibd 23:33:00 ./mysql/help_keyword.ibd 23:33:00 ./mysql/help_relation.ibd 23:33:00 ./mysql/help_topic.ibd 23:33:00 ./mysql/innodb_index_stats.ibd 23:33:00 ./mysql/innodb_table_stats.ibd 23:33:00 ./mysql/plugin.ibd 23:33:00 ... ./xtrabackup_logfile 23:33:09 #<---可以看出這個(gè)文件是最后修改和保存的 ./zabbix/acknowledges.frm 23:33:09 ./zabbix/actions.frm 23:33:09 ... ./zabbix/users_groups.frm 23:33:09 ./zabbix/usrgrp.frm 23:33:09 ./zabbix/valuemaps.frm 23:33:09 ./zabbix/widget_field.frm 23:33:09 ./zabbix/widget.frm 23:33:09
最后,我們通過(guò)文件的創(chuàng )建時(shí)間和修改時(shí)間,實(shí)戰地驗證了《xtrabackup 原理圖》的第一和第七步順序的正確性。
總結
以上就是這篇文章的全部?jì)热萘?,希望本文的內容對大家的學(xué)習或者工作具有一定的參考學(xué)習價(jià)值,謝謝大家對特網(wǎng)科技的支持。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問(wèn)題,請訪(fǎng)問(wèn)特網(wǎng)科技官網(wǎng):wap.friendlycc.com.cn
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站