linux下安全删除MySQL二进制日志

作者:莫问前程 发布于:2013-9-18 11:31 Wednesday 分类:数据库

 

!!!删除日志文件前一定要先停止mysqld的服务(说多了都是泪啊)!!

 

如果只有一台MySQL服务器则登录MySQL后:

#删除某个日志之前的日志
PURGE BINARY LOGS TO 'mysql-bin.110';
#或删除某个时间点以前的日志
PURGE BINARY LOGS BEFORE '2011-05-05 00:30:00';

或者flush logs;reset master;

如果是主从数据库,则登录MySQL后:

#在所有从库上检查它正在读取哪个日志,执行SHOW SLAVE STATUS;#清理日志PURGE MASTER LOGS BEFORE '2011-05-05 00:30:00';#然后在主服务器上执行PURGE BINARY LOGS BEFORE '2011-05-05 00:30:00';

自动清理:

#配置my.cnf


2

#增加expire_logs_days = 天数

3

#例如保留5

4

expire_logs_days = 5

mysql bin-log日志清理 

1.查看档案

mysql> show binary logs;

+----------------+-----------+

| Log_name | File_size |

+----------------+-----------+

| ablelee.000001 | 150462942 |

| ablelee.000002 | 125 |

| ablelee.000003 | 106 |

+----------------+-----------+



2.删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003)

mysql> purge binary logs to 'ablelee.000003';

Query OK, 0 rows affected (0.16 sec)



3. 查询结果(现在只有一条记录了.)

mysql> show binlog events\G

*************************** 1. row ***************************

Log_name: ablelee.000003

Pos: 4

Event_type: Format_desc

Server_id: 1

End_log_pos: 106

Info: Server ver: 5.1.26-rc-log, Binlog ver: 4

1 row in set (0.01 sec)

(ablelee.000001ablelee.000002已被删除)

mysql> show binary logs;

+----------------+-----------+

| Log_name | File_size |

+----------------+-----------+

| ablelee.000003 | 106 |

+----------------+-----------+

1 row in set (0.00 sec)



(删除的其它格式运用!)

  PURGE {MASTER | BINARY} LOGS TO 'log_name'
  PURGE {MASTER | BINARY} LOGS BEFORE 'date'
  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
  例如:
  PURGE MASTER LOGS TO 'mysql-bin.010';
  PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
清除3天前的 binlog
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
  BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTERBINARY是同义词。
  如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
  要清理日志,需按照以下步骤:
  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
  5. 清理所有的日志,但是不包括目标日志。

ports安装了mysql以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。

这样做主要有以下两个目的:
1:数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

处理方法分两种情况:
1:只有一个mysql服务器,那么可以简单的注释掉这个选项就行了。
vi /etc/my.cnf把里面的log-bin这一行注释掉,重启mysql服务即可。
2:如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。
C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。
D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。
清理日志方法为:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';

如果你确定从服务器已经同步过了,跟主服务器一样了,那么可以直接RESET MASTER将这些文件删除。

 

评论(0) 引用(123) 浏览(41812)

Iptables 对服务器的简单防护策略

作者:莫问前程 发布于:2013-9-18 11:15 Wednesday 分类:网络攻防战

有的时候我们的对外提供服务的机器即使在最外层有了硬件防火墙也要自身做一些简单的防护,硬件防火墙也难免被攻破,系统自身有了防护功能,也能拖延全部被黑的时间,相信一个合格的SA应该能够在这段时间及时发现了入侵痕迹了。
  很好很强大!
  在最后给大家个好东西,这个是 Daniel Robbins (drobbins@gentoo.org), 总裁兼 CEO, Gentoo Technologies, Inc. 写的动态iptables防火墙,添加和删除被阻止的IP都很方便,使用说明都在里面了,哈哈
  下面简单的介绍linux自带的IPTABES的防护规则
  防火墙安全的配置原则是:全部拒绝,在允许相应的包进入,即:没有明确允许的全部拒绝!
  ----------------------------------------
  基本配置举例:
  # iptables -A INPUT -s [!] 192.168.2.110 [指定匹配的主机] [!]:匹配指定主机之外的主机
  # iptables -A INPUT -s [!] 192.168.2.0/24[指定匹配的网络] [!]:匹配指定网络之外的网络
  # iptables -A INPUT -p tcp -m  mutilport --source-port 22,53,80,110 [匹配多个源端口]
  # iptables -A INPUT -p tcp -m  mutilport --destination-port 22,53,80,110 [匹配多个目的端口]
  # iptables -p tcp --syn [--syn 等于 “--tcp-fiags SYN,RST,ACK SYN”的简写]
  # iptables -A INPUT -p tcp -m state --state ESTABLISHED RELATED -j ACCEPT [对于已经建立的连接允许进入]
  # iptables -A INPUT -P TCP !SYN -M STATE --STATE NEW -j LOG --log-prefix "日志的标志字符"
  [记录日志]
  -----------------------------------------
  NAT防火墙发布服务器配置: [ 拨号上网]
  # iptables -t nat -A [PREROUTING] -i [ppp0]  -p [tcp/udp] -d [公网接口地址]  --dport[发布服务的端口号]
  -j  DNAT --to-destination  [IP]
  NAT上网配置:
  # iptables -t nat -A POSTROUTING -O [PPP0]   -j MASQUERADE
  转换内部网络地址IP为公有IP地址:
  # iptables -t nat -A POSTROUTING -s [ 内部IP地址范围] -o [出站接口]  -j SNAT --to [ 外部接口地址]
  -------------------------------------------
  拒绝黑客攻击:
  # iptables -A [FORWARD / INPUUT] -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
  [对碎片进行限制,防止碎片攻击]
  # iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
  [限制ICMP数据包允许一秒通过一个包 限制触发条件是 10 个包 ]
  # iptables -A INPUT -m limit --limit 3/minute --limit-burst 3
  -j LOG --log-level INFO --log-prefix "IP INPUT packaget died:"
  # iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3
  -j LOG --log-level DEBUG --log-prefix "IP INPUT packaget died:"
  # iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3
  -j LOG --log-level DEBUG --log-prefix "IP INPUT packaget died:"
  --------------------------------------------
  拒绝 ping 回应:
  # iptables -A -INPUT -p icmp -i eth0 -j DROP
  打开内核的路由转发功能:
  # echo "1" > /proc/sys/net/ipv4/ip_forward
  [注意:重启机器后失效,建议写在启动脚本里:/etc/rc.d/rc.local/ 中]
  ----------------------------------------------
  透明代理重定向配置:
  # iptables -t nat PREROUTING -i eth0 -p tcp -s 192.168.2.0/24 --dport 80 -j REDIRECT --to-port 3128
  保存配置与恢复配置:
  # iptables-save > /etc/sysconfig/iptables[保存路径]
  # iptables-restore  <  /etc/sysconfig/iptables [保存路径]

标签: IP tables

评论(0) 引用(95) 浏览(33024)

linux 阻挡CC攻击

作者:莫问前程 发布于:2013-9-18 11:14 Wednesday 分类:网络攻防战

 什么是CC攻击?CC攻击就是利用大量代理服务器对目标计算机发起大量连接,导致目标服务器资源枯竭造成拒绝服务。那么如何判断查询CC攻击呢?本文主要介绍了一些Linux下判断CC攻击的命令。
  #查看所有80端口的连接数
  netstat -nat|grep -i "80"|wc -l
  #对连接的IP按连接数量进行排序
  netstat -anp | grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
  netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
  netstat -ntu | awk '{print $5}' | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c | sort -nr
  #查看TCP连接状态
  netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
  netstat -n | awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
  netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
  netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
  netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
  netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
  #查看80端口连接数最多的20个IP
  cat /www/web_logs/waitalone.cn_access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -100
  tail -n 10000 /www/web_logs/waitalone.cn_access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -100
  cat /www/web_logs/waitalone.cn_access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -100
  netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
  netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20
  #用tcpdump嗅探80端口的访问看看谁最高
  tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
  #查找较多time_wait连接
  netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
  #查找较多的SYN连接
  netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
  #linux下实用iptables封ip段的一些常见命令:
  #封单个IP的命令是:
  iptables -I INPUT -s 211.1.0.0 -j DROP
  #封IP段的命令是:
  iptables -I INPUT -s 211.1.0.0/16 -j DROP
  iptables -I INPUT -s 211.2.0.0/16 -j DROP
  iptables -I INPUT -s 211.3.0.0/16 -j DROP
  #封整个段的命令是:
  iptables -I INPUT -s 211.0.0.0/8 -j DROP
  #封几个段的命令是:
  iptables -I INPUT -s 61.37.80.0/24 -j DROP
  iptables -I INPUT -s 61.37.81.0/24 -j DROP
  #想在服务器启动自运行的话有三个方法:
  #1、把它加到/etc/rc.local中
  #2、iptables-save >/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执行。
  #3、service iptables save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时#自动执行。
  #后两种更好此,一般iptables服务会在network服务之前启来,更安全。
  #解封的话:
  iptables -D INPUT -s IP地址 -j REJECT
  iptables -F #全清掉了

标签: CC攻击

评论(0) 引用(94) 浏览(32653)

常见mysql的错误以及解决方法

作者:莫问前程 发布于:2013-9-17 23:56 Tuesday 分类:数据库

MYSQL启动错误
  Can't open the mysql.plugin table...2009-06-01 00:52Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
  mysql是已经被编译好的mysql-5.1.28-rc-linux-i686-glibc23.tar.gz
  shell>mkdir /usr/local/mysql
  shell> groupadd mysql
  shell> useradd -g mysql mysql
  shell> tar zxf /path/to/mysql-VERSION-OS.tar.gz
  shell> cp -r * full-path-to-mysql-VERSION-OS/* /usr/local/mysql/
  shell> cd /usr/local/mysql
  shell> chown -R mysql .
  shell> chgrp -R mysql .
  shell> scripts/mysql_install_db --user=mysql
  shell> chown -R root .
  shell> chown -R mysql data
  shell> bin/mysqld_safe --user=mysql &
  这是执行scripts/mysql_install_db --user=mysql没有成功的原因,没有一个初始化数据库,不能启动mysql守护进程,重新执行:
  shell> scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/date --user=mysql
  由于安装方法不同mysql的安装目录也不相同,mysql_install_db文件的位置也不一样
  可以使用find / -name mysql_install_db来查找
  实例:
  /usr/local/mysql/bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql  --basedir=/usr/local/mysql
  --------------------------------------------------------------------------------
  在MYSQL启动老失败即:Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
  查看错误日志显示:mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
  /usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist
  Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
  InnoDB: The first specified data file ./ibdata1 did not exist:
  [root@centos var]# service mysqld stop
  MySQL manager or server PID file could not be found!       [FAILED]
  解决办法:
  首先查看一下进程
  [root@centos mysql]# ps aux |grep mysq*
  root      2643  0.0  0.2   4536  1224 ?        S    01:09   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/centos.pid
  mysql     2757  0.0  1.2  36976  6608 ?        Sl   01:09   0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --log-error=/usr/local/mysql/var/centos.err --pid-file=/usr/local/mysql/var/centos.pid --socket=/tmp/mysql.sock --port=3306
  root      4788  0.0  0.1   3920   684 pts/2    R+   11:11   0:00 grep mysq*
  如果看到上面的内容,那说明,Mysql的进程卡死了,这时用就要把这些卡死的进程都关闭
  [root@centos mysql]# kill 2643
  [root@centos mysql]# kill 2757
  启动Mysql 就ok了
  [root@centos mysql]# service mysqld start
  Starting MySQL.                                            [  OK  ]
  --------------------------------------------------------------------------------
  mysql数据库忘记密码
  现在终于被我找到了解决方法,如下(请先测试方法三,谢谢!):
  方法一:
  # /etc/init.d/mysql stop
  # mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
  # mysql -u root mysql
  mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
  mysql> FLUSH PRIVILEGES;
  mysql> quit
  # /etc/init.d/mysql restart
  # mysql -uroot -p
  Enter password: <输入新设的密码newpassword>
  方法二:
  直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:
  # mysql -udebian-sys-maint -p
  Enter password: <输入[client]节的密码>
  mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
  mysql> FLUSH PRIVILEGES;
  mysql> quit
  # mysql -uroot -p
  Enter password: <输入新设的密码newpassword>
  mysql>
  --------------------------------------------------------------------------------
  遇到了 SQLException: access denied for  @'localhost' (using password: no)
  解决办法   grant all privileges on *.* to py@localhost identified by '1';
  flush privileges;
  拿  py    1 登陆
  附:
  mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
  权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
  当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
  当数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
  用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
  ‘连接口令’不能为空,否则创建失败。
  mysql>grant select,insert,update,delete,create,drop on vtdc.employee to py@192.168.1.1 identified by ‘123′;
  给来自192.168.1.1的用户py分配可对数据库vtdc的employee表进行select,insert,update,delete,create,drop等操作的权限,并设定口令为123。
  mysql>grant all privileges on 51cto.* to py@192.168.1.1 identified by ‘123′;
  给来自192.168.1.1的用户py分配可对数据库51cto所有表进行所有操作的权限,并设定口令为123。
  mysql>grant all privileges on *.* to py@192.168.1.1 identified by ‘123′;
  给来自192.168.1.1的用户py分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。
  mysql>grant all privileges on *.* to joe@localhost identified by ‘123′;
  给本机用户joe分配可对所有数据库的所有表进行所有操作的权限,并设定口令为123。

标签: MYSQL

评论(0) 引用(86) 浏览(24982)

centos-yum update问题

作者:莫问前程 发布于:2013-9-17 23:55 Tuesday 分类:Linux

刚安装完的centos 6.2系统发现yum仓库更新不了。提示报错信息:

[root@hbase01-222 ~]# yum update

Loaded plugins: aliases, changelog,downloadonly, fastestmirror, kabi, presto, security, tmprepo, verify,versionlock

Loading support for CentOS kernel ABI

Determining fastest mirrors

Could not retrieve mirrorlisthttp://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was

14: PYCURL ERROR 6 - "Couldn't resolvehost 'mirrorlist.centos.org'"

Could not retrieve mirrorlisthttp://mirrorlist.centos.org/?release=6&arch=x86_64&repo=extras errorwas

14: PYCURL ERROR 6 - "Couldn't resolvehost 'mirrorlist.centos.org'"

Could not retrieve mirrorlisthttp://mirrorlist.centos.org/?release=6&arch=x86_64&repo=updates errorwas

14: PYCURL ERROR 6 - "Couldn't resolvehost 'mirrorlist.centos.org'"

http://mirrors.163.com/centos/6.2/os/x86_64/repodata/repomd.xml:[Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.163.com'"

Trying other mirror.

Error: Cannot retrieve repository metadata(repomd.xml) for repository: base. Please verify its path and try again

[root@hbase01-222 ~]# service iptables stop

[root@hbase01-222 ~]# nslookup  mirrorlist.centos.org

;; connection timed out; no servers couldbe reached

到这里发现问题了,我的域名解析不了,yum的配置文件里指向的域名就识别不了了。重新设置下dns指向。

[root@hbase01-222 ~]# vim /etc/resolv.conf

# Generated by NetworkManager

search 38forsbm

nameserver 8.8.8.8

[root@hbase01-222 ~]# yum update –y   --更新可以使用。

标签: LINUX

评论(0) 引用(92) 浏览(26072)

Powered by 木匠 鲁ICP备88888888号