对于大日志分割的几种方法

对于大日志分割的几种方法

当日志容量上G的时候,用vi查看具体内容效率就会变得特别低,这个时候就需要将大日志进行分割。
为了比较各种分割方法的效果,我选取的测试日志基本信息如下:

# ls -lrth test.log
-rw-r--r-- 1 root root 645M 530 20:42 test.log
# wc -l test.log
8856340 test.log

1. split方法分割

split命令专门用来将一个大文件分割成很多个小文件,我把split命令的选项做一个简要说明

选项含义
-b分割后的文档大小,单位是byte
-C分割后的文档,单行最大byte数
-d使用数字作为后缀,同时使用-a length指定后缀长度
-l分割后文档的行数

为了尽量保证日志的可读性,我们按行分割大日志文件,并且指定分割后的文件的前缀和后缀

#后缀是数字,占两位,前缀是test.log
split -l 1000000 test.log -d -a 2 test.log
#分割之后的结果
ls -lrth
总用量 1.3G
-rw-r--r-- 1 root root 645M 5月  30 20:42 test.log
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log00
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log01
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log02
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log03
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log04
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log05
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log06
-rw-r--r-- 1 root root  73M 5月  30 20:55 test.log07
-rw-r--r-- 1 root root  64M 5月  30 20:55 test.log08

2. dd分割

dd bs=1M count=300 if=test.log of=newlog.1
dd bs=1M count=300 if=test.log of=newlog.2 skip=300
dd bs=1M count=300 if=test.log of=newlog.3 skip=600

分割后的效果

ls -lrth
总用量 1.3G
-rw-r--r-- 1 root root 645M 530 20:42 test.log
-rw-r--r-- 1 root root 300M 530 21:07 newlog.1
-rw-r--r-- 1 root root 300M 530 21:07 newlog.2
-rw-r--r-- 1 root root  45M 530 21:07 newlog.3

在上面使用的命令中,bs代表数据块的大小,count表示复制的块数,if表示输入文件,of表示输出文件。
这个命令不能一下就把文件分割到我们想要的状态,而且很有可能一行日志被分到两个文件中。

3. head+tail分割

用这两个命令获取文件部分内容,然后重定向就能实现文件分割,但是限制也挺多,只能把文件分成两部分,如果文件特别大,想要达到预期的效果,就要一直分割下去。
head/tail -n $行数 test.log > newlog
因为这两个命令都比较熟悉,不再多讲。

4. sed实现分割

实现原理就是用sed截取特定行之间的内容,然后进行重定向。

sed -n '1,2000000p' test.log > test.log.1
sed -n '2000001,4000000p' test.log > test.log.2
sed -n '4000001,6000000p' test.log > test.log.3
sed -n '6000001,8000000p' test.log > test.log.4
sed -n '8000001,$p' test.log > test.log.5

$表示最后一行,这个如果分割过多,也需要一个循环。

5. awk实现分割

实现原理和sed差不多,因为使用awk不多,这里只举一个小例子:

awk ‘{if (NR<120000) print $0}’ test.log > a.txt
awk ‘{if (NR>=120000) print $0}’ test.log > b.txt

还是split用得舒服。

参考博客:http://blog.csdn.net/wind0513/article/details/5871293

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。 引用: mysql数据库本身高度灵活,造成性能不足,严重依赖开发人员能力。也就是说开发人员能力高,则mysql性能高。这也是很多关系型数据库的通病,所以公司的dba通常工资巨高。 引用: 以上三种方案,按顺序使用即可,数据量在亿级别一下的没必要换nosql,开发成本太高。三种方案我都试了一遍,而且都形成了落地解决方案。该过程心中慰问跑路的那几个开发者一万遍 :) 方案一详细说明:优化现有mysql数据库。 根据引用内容,你提到的mysql表数据量过大,导致查询速度变慢,业务受到严重影响。MySQL数据库本身的灵活性使得其性能有所不足,且高度依赖开发人员的能力。因此,为了解决这个问题,可以考虑以下几个方案: 1. 优化现有MySQL数据库:对于表数据量过大的情况,可以通过对数据库进行优化来提高查询性能。这包括合理设计表结构、创建索引、优化SQL语句等。可以使用MySQL自带的性能优化工具如EXPLAIN语句和慢查询日志来帮助识别性能瓶颈和优化查询。 2. 水平分表:如果数据量仍然无法满足需求,可以考虑将表按照某个维度进行水平分割,将数据分散到多个表中,以减轻单表的数据量。例如,可以按照时间或者用户ID等维度进行分表,然后通过应用层逻辑将多个表的数据合并查询。 3. 数据库分库分表:如果数据量进一步增长到亿级别,可以考虑将数据库进行分库分表。这意味着将数据分散到多个数据库实例和表中,以提高查询性能和可扩展性。这可以通过使用分布式数据库中间件如MySQL的分库分表插件或者使用NoSQL数据库来实现。 综上所述,对于mysql表数据量过大的情况,可以通过优化现有数据库、水平分表和数据库分库分表等方案来提高查询性能和解决业务影响的问题。具体方案的选择需根据实际情况和需求来确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL单表数据量大优化方案及注意事项](https://blog.csdn.net/a991361563/article/details/120038498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值