一.准备安装包官网下载:想亲自体验一下的,点击https://www.mysql.com/downloads/并按下面步骤来;步骤1:点击链接进入MySQL,光标向下滑到底部,点击community(GPL)Downloads>>,步骤2:可以看到有很多选择,点击MySQL Community Server进入步骤3:进入之...
数据库中的索引分为两种类型,分别是普通索引、唯一索引。下面让我们来分别介绍一下这两种索引。第一种是普通索引,CREATE INDEX indexName ON mytable(username(length));创建表的时候直接指定。删除索引的语法:DROP INDEX [indexName] ON mytable;...
体步骤如下。
1)下载并安装truncate。
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.9.tar.gz
tar -zxvf coreutils-8.9.tar.gz
cd coreutils-8.9
./configure
make
cp src/truncate /usr/bin/
2)如下是一个删除大文件的脚本。
cat rm_large_file.sh
#!/bin/bash
## 调用 truncate命令删除文件 ,仅针对大文件 (大于几个 GB的文件 )
## 调用方式 ./rm_large_file file_name
if [ "$#" != "1" ] ; then
echo "please input file name"
exit 99
fi
filename=$1
filesize=`ls -lh $filename | cut -d\ -f5| cut -dG -f1`
# 文件大于 1GB时 ,且必须是数字
if [[ "${filesize}" == *[!0-9]* ]] ; then
echo "warning:非数字 ,可能没有 1GB"
exit 99
fi
if [ $filesize -le 1 ];then
echo "too smalll size"
exit 88
fi
if [ $filesize -ge 500 ];then
echo "too large size,please modify the shell scripts"
exit 88
fi
sleeptime=3
echo "truncate file $filename ... ,sleep $sleeptime seconds per truncates"
date_start=$(date +%s)
for i in `seq $filesize -1 1 `
do
sleep $sleeptime
echo "truncate to ${i}G"
truncate -s ${i}G $filename
done
rm $filename
date_end=$(date +%s)
echo "`date "+%Y-%m-%d %H:%M:%S"` . rm file $filename completed. ($((date_end-date_start)) sec)"
做运维的估计都知道使用ext3文件系统时删除大文件很慢,那么大家有没有想过为什么呢?我也有过同样的疑问,于是查了相关资料并找到了一些理由。
在ext系列的文件系统中有一个很重要的概念inode(它与文件独立存在),它维护了文件的相关属性信息。
struct ext3_inode {
__u16 i_mode; /* File mode */
__u16 i_uid; /* Low 16 bits of Owner Uid */
__u32 i_size; /* 文件大小,单位是 byte */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* Modification time */
__u32 i_dtime; /* Deletion Time */
__u16 i_gid; /* Low 16 bits of Group Id */
__u16 i_links_count; /* Links count */
__u32 i_blocks; /* blocks 计数 */
__u32 i_flags; /* File flags */
__u32 l_i_reserved1; /* 可以忽略 */
__u32 i_block[EXT3_N_BLOCKS]; /* 一组 block 指针 */
__u32 i_generation; /* 可以忽略 */
__u32 i_file_acl; /* 可以忽略 */
__u32 i_dir_acl; /* 可以忽略 */
__u32 i_faddr; /* 可以忽略 */
__u8 l_i_frag; /* 可以忽略 */
__u8 l_i_fsize; /* 可以忽略 */
__u16 i_pad1; /* 可以忽略 */
__u16 l_i_uid_high; /* 可以忽略 */
__u16 l_i_gid_high; /* 可以忽略 */
__u32 l_i_reserved2; /* 可以忽略 */
};
从它的数据结构就可以看出有atime,ctime,mtime(这几个名词是不是特别熟?因为经常会在find命令使用到它)。然后这里重点讨论就是i_block[EXT3_N_BLOCKS]这个数组,它记录了文件存在磁盘上的具体位置,里面很多block指针,它们指向了数据在磁盘上的位置。问题就出在这,当一个文件很大的时候,仅仅用这个i_block[EXT3_N_BLOCKS]无法表示(最大只能表示到EXT3_N_BLOCKS*block_size)以后,那么就只能通过嵌套的block指针,也就是里面的某个指针又是指向一个新的block[]这样就可以记录更大的文件。但是这样带来的后果却是删除大文件的操作会变得很慢。为什么呢?有两点:
1.刚才说了由于采用这种映射关系i_block[EXT3_N_BLOCKS],所以当文件很大,映射的层次就会增多,这也会增加相应操作的代价,比如说分配存储空间、删除数据文件。
2.因为我们在创建一系列文件的时候,对应inode的存储空间都是顺序分配的,这些inode都是顺序相邻的,但是对于这些文件本身则不是顺序的。这个就相当于数据库中的堆表的行和索引的关系,在索引中每个行按索引字段顺序存储的,但是他们对应的数据文件中的行却是随机(random)的(这里的行相当于文件系统中的一个文件,而索引里面的行则相当于inode),而我们在删除一个文件时,不仅要删除数据文件也要删除对应的inode,所以这就增加了随机查找的代价。
在第1点里面,是因为文件大导致删除文件慢,第2点则解释了文件多而导致删除文件慢
那ext4是怎么改进的呢?根据百科上对ext4的介绍,它与ext3一个很大的不同点在于使用了extent分配存储空间(是不是发现它很熟悉,因为Oracle、innodb里面都有这个概念),extent最大的优势在于连续分配,这样效率便会极大的提高。在其他方面的改进?参考百科~
/*
* Structure of an inode on the disk
*/
struct ext4_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size_lo; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Inode Change time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks_lo; /* Blocks count */
__le32 i_flags; /* File flags */
union {
struct {
__le32 l_i_version;
} linux1;
struct {
__u32 h_i_translator;
} hurd1;
struct {
__u32 m_i_reserved1;
} masix1;
} osd1; /* OS dependent 1 */
__le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
__le32 i_generation; /* File version (for NFS) */
__le32 i_file_acl_lo; /* File ACL */
__le32 i_size_high;
__le32 i_obso_faddr; /* Obsoleted fragment address */
union {
struct {
__le16 l_i_blocks_high; /* were l_i_reserved1 */
__le16 l_i_file_acl_high;
__le16 l_i_uid_high; /* these 2 fields */
__le16 l_i_gid_high; /* were reserved2[0] */
__u32 l_i_reserved2;
} linux2;
struct {
__le16 h_i_reserved1; /* Obsoleted fragment number/size
which are removed in ext4 */
__u16 h_i_mode_high;
__u16 h_i_uid_high;
__u16 h_i_gid_high;
__u32 h_i_author;
} hurd2;
struct {
__le16 h_i_reserved1; /* Obsoleted fragment number/size
which are removed in ext4 */
__le16 m_i_file_acl_high;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* OS dependent 2 */
__le16 i_extra_isize;
__le16 i_pad1;
__le32 i_ctime_extra; /* extra Change time (nsec << 2>
__le32 i_mtime_extra; /* extra Modification time(nsec << 2>
__le32 i_atime_extra; /* extra Access time (nsec << 2>
__le32 i_crtime; /* File Creation time */
__le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2>
__le32 i_version_hi; /* high 32 bits for 64-bit version */
};
从ext4_inode的数据结构来看,ext3的inode数据结构在ext4的inode里面都存在,我想这或许是为了ext4的兼容ext3而做的吧。
我只是简单的解释了一下为什么ext3在处理大文件和文件数量很多时相关操作的弊端,那么你有什么看法呢?欢迎交流~
参考文章
[1] http://www.ibm.com/developerworks/cn/linux/filesystem/ext2/index.html
[2] http://www.landley.net/kdocs/ols/2002/ols2002-pages-425-438.pdf
[3] http://baike.baidu.com/view/2220807.htm
用命令删除,不是直接删除。
相关问题推荐
NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路。MongoDB:它是一个内存数据库,数据都是放在内存里面的。对数据的操...
数据仓库系统长期以来一直是企业 IT 架构的重要组成部分。随着开源技术的不断发展以及云端部署方式的不断深入,传统数据仓库的局限性日益凸显,难以适应新技术带来的市场变革,如何面向大数据技术进行数据仓库的优化、转型是企业 IT 管理者面临的重要挑战。处...
Java可实现与绝大多数主流数据库的连接与操作。日常企业开发以使用开源数据库居多。1)、MySQL数据库是目前使用最广泛最好的免费开源数据库2)、MariaDB数据库是MySQL的一个分支,保持与MySQL的高度兼容性,确保具有库二进制奇偶校验的直接替换功能,以及与My...
mysql是存放discuz所有数据信息的,比如用户的注册信息,用户发表的贴子和回帖,以及版块信息,上传的图片并不是存放在数据库里的,数据库只是记录图片的存放目录和名字。
常用命令比较多,看下面介绍的吧MYSQL常用查命令:mysql> select version(); 查看MySQL的版本号mysql> select current_date(); 查看MySQL的当前日期mysql> select version(),current_date(); 同时查看MySQL的版本号和当前日期mysql> show database...
一:什么是SQLSQL是一种数据库语言,可以定义和操作数据库。SQL由ISO(国际标准化组织)标准化,和其他数据库中几乎是相同的方式运行,SQL大致分为三种语言。它在控制和操作数据库时使用,它是一种在所有语句中组合动词和对象的语法。二:什么是MySQLMySQL是...
一.准备安装包官网下载:想亲自体验一下的,点击https://www.mysql.com/downloads/并按下面步骤来;步骤1:点击链接进入MySQL,光标向下滑到底部,点击community(GPL)Downloads>>,步骤2:可以看到有很多选择,点击MySQL Community Server进入步骤3:进入之...
打开Navicat打开mysql数据库连接点击要视图所在的数据库,并选中视图菜单,此时会显示所有视图右击要修改的视图,然后选择【设计视图】选择【视图创建工具】修改视图中显示的表或字段点击【预览】,此时可显示视图的sql定义和预览数据,然后点击【保存】,视...
数据库中的索引分为两种类型,分别是普通索引、唯一索引。下面让我们来分别介绍一下这两种索引。第一种是普通索引,CREATE INDEX indexName ON mytable(username(length));创建表的时候直接指定。删除索引的语法:DROP INDEX [indexName] ON mytable;...
常见的关系型数据库有mysql 、SQL Server、Oracle、Sybase、DB2等。关系型数据库是目前最受欢迎的数据库管理系统,技术比较成熟。1、MySQLMySQL是目前最受欢迎开源的SQL数据库管理系统,与其他的大型数据库Oracle、DB2、SQL Server等相比,MySQL虽然有它的不...
(1)控制面板 ---> 程序和功能 ---> 卸载MySQL Installer;(2)删除MySQL软件安装路径下的MySQL目录,默认目录为 C:\Program Files (x86)\MySQL ;(3)删除ProgramData下的MySQL数据文件目录,默认目录为 C:\ProgramData\MySQL (注意:ProgramData为隐藏...
mysql5.7的主从复制是多线程了,阿里在这块也很早就做过优化,如果还是用5.7以下的社区版本的话,最简单的方式也就是垂直切分,按业务多分几个集群吧,然后一些读写频繁但对数据一致性要求不高的功能尽量扔redis实现...
数据抄独立性是 数据库系统的一个最重要的目标之一。它能使数据独立袭于 应用程序。数据独立性包括数据的物理独立性和逻辑独立性知。数据的独立性是数据库系统的最基本的特征之一 。数据独立性是指应用程序和数据结构之间相互独道立, 互不影响。...
互联网行业,使用MySQL社区版占绝大多数。金融,保险等对于数据安全及其敏感的行业,使用Oracle是主流,小部分使用IBM的DB2。其他实体行业,基本是Oracle和SQL Server平分天下。