1、释放内存: sync echo 3 > /proc/sys/vm/drop_caches Linux查看Dell服务器型号 命令: dmidecode | grep "Product Name" 查看系统负载: cat /proc/loadavg 0.0 0.00 0.00 1/283 10904 意思是:前三个是系统负载,1/283中,1代表此时运行队伍中的进程个数,而283是代表此时的进程总数 10904到此为止,最后创建的一个进程ID。 系统装好后,要做的事如下: 关闭防火墙Selinux: vim /etc/selinux/confi
2、g 把SELINUX=enforcing改成SELINUX=disabled 更改主机名: vim /etc/sysconfig/network 修改主机名,不要用localhost 添加hosts主机记录 vim /etc/hosts中,在127.0.0.1后面,添加自己的主机名 创建0-9 a-z目录 for i in `seq 0 9` {a..z};do mkdir -p $i;done: 测试硬盘性能工具:iozone 监视服务器每少上下文切换数次工具:Nmon(很不错的性能监视工具) #占用内存大小前10的进程 ps -eo comm,si
3、ze --sort -size | head -10 #占用cpu使用前10的进程 ps -eo comm,pcpu --sort -pcpu | head -10 一、Apache服务优化: 2 1.配置cronolog进行日志轮询 2 2.错误页面优雅显示 2 3.mod_deflate文件压缩功能 3 4.mod_expires缓存功能 4 5.更改apache的默认用户 5 6.worker模式,提升并发数(可以达到2000-5000) 5 7.屏蔽apache版本等敏感信息 6 8.apache目录文件权限设置(root,目录755,文件6
4、44) 6 9.开启httpd-mpm.conf 增加连接数 6 10. apache防盗链功能 8 11.禁止目录Index 8 12. 禁止用户覆盖(重载) 8 13.关闭CGI 9 14.避免使用.htaccess文件(分布式配置文件) 9 15. apache的安全模块 9 16.正确途径取得源代码,勤打apache补丁 10 17.apache日志授予root 700权限 10 18.系统内核参数优化 10 19.禁止PHP解析指定站点的目录 10 20.使用tmpfs文件系统替代频繁访问的目录 11 21尽可能减少 HTTP 请求数 11 22使用CDN
5、做网站加速 12 查看你的服务器网络连接状态 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ◆CLOSED:无连接是活动的或正在进行 ◆LISTEN:服务器在等待进入呼叫 ◆SYN_RECV:一个连接请求已经到达,等待确认 ◆SYN_SENT:应用已经开始,打开一个连接 ◆ESTABLISHED:正常数据传输状态 ◆FIN_WAIT1:应用说它已经完成 ◆FIN_WAIT2:另一边已同意释放 ◆ITMED_WAIT:等待所有分组死掉 ◆CLOSIN
6、G:两边同时尝试关闭 ◆TIME_WAIT:另一边已初始化一个释放 ◆LAST_ACK:等待所有分组死掉 ESTABLISHED的值其实也是当前的并发数,这个可重点关注下;另外,可关注下TIME——WAIT这项的数值。Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。 #查看系统本地可用端口极限值 cat /proc/sys/net/ipv4/ip_local_port_range 寻找恶意IP并用iptab
7、les禁止掉 netstat -an| grep :80 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1,$4}' | uniq -c | awk '$1 >50 {print $1,$2}' 4.5备份单个数据库 mysqldump -u 用户 –p’密码’ --default-character-set=latin1 数据库名 > 备份文件名(数据库默认编码是latin1) 普通备份: mysqldump -uroot -p'oldboy123' oldboy > /server/ba
8、k/oldboy.sql 压缩备份: mysqldump -uroot -p'oldboy123' oldboy |gzip > /server/bak/oldboy.sql.gz 设置字符集备份: mysqldump -uroot -p'oldboy123' oldboy --default-character-set=gbk |gzip > /server/bak/oldboy.sql.gz 执行结果: [root@oldboy ~]# mkdir /server/bak -p [root@oldboy ~]# mysqldump -uroot -p'oldboy123' o
9、ldboy > /server/ba backup/ bak/ [root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy > /server/bak/oldboy.sql [root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy |gzip > /server/bak/oldboy.sql.gz [root@oldboy ~]# ls -l /server/bak/ total 8 -rw-r--r-- 1 root root 1991 Apr 9 00:51 oldbo
10、y.sql -rw-r--r-- 1 root root 801 Apr 9 00:51 oldboy.sql.gz 4.6 mysqldump在做啥? mysqldump实际上就是把数据从mysql库里以逻辑的sql语句的形式导出。 备份的数据过滤掉注释: [root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy.sql DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name`
11、char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5,'wodi'),(6,'yingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'鑰佺敺瀛?),(11,'鎴?); <==这里是乱码,是因为导出时的格
12、式没加字符集,而系统当前字符集又是zh_cn.gb18030格式,一般恢复到数据库里会正常,只是系统外查看不正常而已。另外insert是批量插入的方式,这样在恢复时效率很高。 UNLOCK TABLES; 提示:看到了吧,就是我们曾经插入的表和数据。 [root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy --default-character-set=gbk > /server/bak/oldboy-gbk.sql [root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy-gb
13、k.sql DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5
14、'wodi'),(6,'yingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'老男孩'),(11,'我'); <==。其他乱码是当初插入时就有问题的。 UNLOCK TABLES; 4.7备份多个库 [root@oldboy ~]# mysqldump -uroot -p'oldboy123' -B oldboy mysql --default-character-set=gbk > /server/bak/oldboy-gbk-muli.sql 提示:-B参数是关键,表示接多个库。 ※※※※※(生产环境常
15、用) -B, --databases To dump several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames. 'USE db_name;' will be included in the output. 参数说明:该参数用于导出若干个数
16、据库,在备份结果中会加入USE db_name和CREATE DATABASE `db_name`; -B后的参数都将被作为数据库名。该参数比较常用。当-B后的数据库列全时 同 -A参数。请看-A的说明。 4.8备份单个表 mysqldump -u 用户名 -p 数据库名 表名> 备份的文件名 mysqldump -u root -p oldboy test> oldboy_oldboy.sql 执行结果: [root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy test --default-character-se
17、t=gbk > /server/bak/oldboy-gbk-single.sql 提示:无-B参数,库oldboy后面就是test表了。 4.9备份多个表 [root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy test ett --default-character-set=gbk > /server/bak/oldboy-gbk-muti-tables.sql [root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy-gbk-muti-tables.sql DROP TA
18、BLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5,'wodi'),(6,'y
19、ingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'老男孩'),(11,'我'); UNLOCK TABLES; DROP TABLE IF EXISTS `ett`; CREATE TABLE `ett` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=gbk; LOCK TABLES `ett` WRITE; UNLOCK TABLES; 4.10备份数据库结构(不包含数据) mysqldump -uroot -d -p'old
20、boy' oldboy oldboy> oldboy_oldboy.sql -d 只备份表结构 [root@oldboy ~]# mysqldump -uroot -p'oldboy123' -d oldboy >/tmp/desc.sql [root@oldboy ~]# egrep -v "\*|--|^$" /tmp/desc.sql DROP TABLE IF EXISTS `ett`; CREATE TABLE `ett` ( `id` int(11) DEFAULT NULL ) ENGIN
21、E=MyISAM DEFAULT CHARSET=gbk; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk; 更多用法可以 执行 mysqldump –help 查询。有关mysql和mysqldump同学们要详细总结。 5恢复数据库 5.1
22、source命令恢复 进入mysql数据库控制台,mysql -u root -p mysql>use 数据库 然后使用source命令,后面参数为脚本文件(如这里用到的.sql) mysql>source oldboy_db.sql #这个文件是系统路径。 [root@oldboy bak]# mysql -uroot -p'oldboy123' Welcome to the MySQL monitor. Commands end with ; or \g. ...skip... Type 'help;' or '\h' for help. Type '\c' to cle
23、ar the current input statement. mysql> use oldboy Database changed mysql> show tables; +------------------+ | Tables_in_oldboy | +------------------+ | ett | | test | +------------------+ 2 rows in set (0.00 sec) mysql> drop tables test; Query OK, 0 rows af
24、fected (0.01 sec) mysql> system ls . oldboy-gbk-muli.sql oldboy-gbk-single.sql oldboy.sql oldboy-gbk-muti-tables.sql oldboy-gbk.sql oldboy.sql.gz mysql> source ./oldboy.sql <==还是用第一版没加字符集的备份,就是备份后查看乱码的备份。 Query OK, 0 rows affected (0.00 sec) ...skip... Query OK, 0 rows af
25、fected (0.00 sec) Q...skip... Query OK, 0 rows affected (0.00 sec) mysql> select * from test; +----+-------------+ | id | name | +----+-------------+ | 1 | zhaoyue | | 2 | jesse | | 4 | elain | | 5 | wodi | | 6 | yingsui | | 7 | zhangyang | |
26、 8 | zaixiangpan | | 9 | ?????? | | 10 | ??? |<==乱码 | 11 | ? | +----+-------------+ 10 rows in set (0.00 sec) mysql> set names gbk; Query OK, 0 rows affected (0.00 sec) mysql> select * from test; +----+-------------+ | id | name | +----+-------------+
27、 | 1 | zhaoyue | | 2 | jesse | | 4 | elain | | 5 | wodi | | 6 | yingsui | | 7 | zhangyang | | 8 | zaixiangpan | | 9 | ?????? | | 10 | 老男孩 | <==仍然是正常的,就是说备份不加字符集导出,将来恢复不会影响恢复的数据,但是备份后查看文件会乱码。 | 11 | 我 | +----+-------------+ 10 rows i
28、n set (0.00 sec) 5.2 mysql命令恢复(标准) mysql -u oldboy -p'oldboy' oldboy < oldboy.sql mysql> system mysql -uroot -p'oldboy123' oldboy < oldboy-gbk.sql <==导入 的是备份时加字符集的版本。 mysql> select * from test; +----+-------------+ | id | name | +----+-------------+ | 1 | zhaoyue | | 2 | jesse
29、 | | 4 | elain | | 5 | wodi | | 6 | yingsui | | 7 | zhangyang | | 8 | zaixiangpan | | 9 | ?????? | | 10 | 老男孩 |<==因为上文source导入时已经set names gbk了, 所以此处不是乱码。 | 11 | 我 | +----+-------------+ 10 rows in set (0.00 sec) 2.1.1.1 MyISAM
30、引擎备份 由于MyISAM引擎为表级锁,因此,在备份时需要防止在备份期间数据写入而导致不一致,所以,在备份时使用--lock-all-tables加上读锁 mysqldump -A -F -B --lock-all-tables |gzip >/data/backup/$(date +%F).tar.gz 特别提示:有关MyISAM和InnoDB引擎的差别和在工作中如何选择,在前面的文章已经详细讲解过了,这里就不在讲了。 2.1.1.2 InnoDB引擎备份 InnoDB引擎为行锁,因此,备份时可以不对数据库加锁的操作,可以加选项--single-transaction进
31、行备份: mysqldump -A -F -B --single-transaction |gzip >/data/backup/$(date +%F).tar.gz 特别注意: 1)--single-transaction仅适用于InnoDB引擎。 生产环境mysqldump备份命令 mysqldump –u root –p –S /data/3306/mysql.sock –default-character-set=gbk –single-transaction –F –B oldboy|gzip > /server/backup/mysql_$(date +%F).sq
32、l.gz :注 -F:刷新bin-log参数,数据库备份完以后,会刷新bin-log 增量备份: 更新bin-log: mysqladmin –uroot –p –S /data/3306/mysql.sock flush-logs 如生成mysql-bin.000004文件 把生成的最新mysql-bin.000004文件,CP到/var/backup/ 把二进制的日志生成 sql语句: mysqlbinlog mysql-bin.000004>bin04.sql 如果有多个库,我们应该用-d来指定恢复单个库 mysqlbinlog mysql-bin.00
33、0004 –d oldboy >binlog.sql (当然对于库也要分库备,否则恢复还是麻烦)
还原数据:先还原全备,再还原增备
先还原全备:mysql –u root –p 34、22:44’ –r time.sql
上面语句将显示2011.03-19 02:58:54-----2011-03-19 03:22:44时间段的binlog,并输出到time.sql
拽定开始时间到文件结束
mysqlbinlog mysql-bin.000004 –start-datetime=’ 2011-03-19 02:58:54’ –d oldboy –r time.sql
这个语句只有开始时间,那么就是从2011-03-19 02:58:54时刻到日志结尾,lodboy数据库的binlog输出到time.sql
基于位置点的增量恢复
指定开始位置和结束位置
m 35、ysqlbinlog mysql-bin.000004 –start-position=510 –stop-position=1312 –r pos.sql
输出初始位置510,结束位置1312的所有binlog日志到pos.sql
注意:结尾的日志点细弱特殊不会被包含。即输出1312pos以前的binlog。
指定开始位置到文件结束
mysqlbinlog mysql-bin.000004 –start-position=510 –r pos510-end.sql
输出初始位置510,结束位置到文件结尾的所有binlog到pos510-end.sql。当然,你也可以指定库名输出bi 36、nlog。如:
mysqlbinlog mysql-bin.000004 --start-position=510 –r pos510-end-oldboy.sql –d oldboy
从文件开头到指定结束位置
mysqlbinlog mysql-bin.000004 --stop-position=954 -r start-954.sql
输出从文件开始位置,到954位置截止的所有binlog
掌握和查找打开的文件
lsof(列出打开的文件)实用程序会显示打开的文件名。其选项仅显示某些进程,只有一个进程的某些文件描述符,或只有某些网络连接(网络连接使用文件描述符,就像普通文件一样 37、lsof 也显示这些)。使用 ps – ef 确定了可疑进程后,输入以下命令:
# lsof -s -p pid
服务器最大设置的连接数:151
mysql> show variables like'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
服务器 38、响应的最大连接数:152
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 152 |
+----------------------+-------+
1 row in set (0.00 sec)
查看服务器key_buffer_size数值:402653184
m 39、ysql> show variables like 'key_buffer_size';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| key_buffer_size | 402653184 |
+-----------------+-----------+
1 row in set (0.00 sec)
查看服务器现在使用的key_buffer_size使用情况:
key_read_requests: 879600044
40、
key-reads: 830525
mysql> show global status like 'key_read%';
+-------------------+-----------+
| Variable_name | Value |
+-------------------+-----------+
| Key_read_requests | 879600044 |
| Key_reads | 830525 |
+-------------------+-----------+
2 rows in set (0.00 sec)
41、
计算索引未命中的概率:
key_cache_miss_rate = key_reads / key_read_requests * 100%
达到0.1%以下(即每1000个请求有一个直接读硬盘)以下都很好,如果key_cache_miss_rae在0.01%以下的话,则说明key_buffer_size分配得过多,可以适当减少。
Key_blocks_unused表示未使用的缓存簇数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过度索引,把缓存占满了。比较理想的设置 42、是:
key_blocks_used / ( key_blocks_unused + key_blocks_used ) * 100 % = 80%
mysql> show global status like 'key_blocks_u%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Key_blocks_unused | 317003 |
| Key_blocks_used | 6439 |
+---------- 43、
2 rows in set (0.00 sec)
临时表:
当执行语句时,关于已经被创造了的隐含临时表的数量,我们可以用如下命令查询其具体情况:
mysql> show global status like 'created_tmp%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Created_tmp_disk_tables | 343326 44、
| Created_tmp_files | 172 |
| Created_tmp_tables | 675795 |
+-------------------------+--------+
3 rows in set (0.00 sec)
每次创建临时表时,created_tmp_tables都会增加,如果是在磁盘上创建临时表,created_tmp_disk_tables也会增加。created_tem_files表示MYSQL服务创建的临时文件数,比较理想的配置是:
Created_Tmp_disk_tables / Created_t 45、mp_tables * 100% <= 25%
比如上面服务器Created_Tmp_disk_tables / Created_tmp_tables * 100% = 50%,比较差了。
我们再看一下MYSQL服务器对临时表的配置:
mysql> show variables where Variable_name in ('tmp_table_size','max_heap_table_size');
+---------------------+----------+
| Variable_name | Value |
+------------------ 46、
| max_heap_table_size | 16777216 |
| tmp_table_size | 16777216 |
+---------------------+----------+
2 rows in set (0.00 sec)
只有16M以下的临时表才能全部放在内存中,超过的就会用到硬盘临时表。
打开表的情况
Open_tables表示打开表的数量,Opend_tables表示打开过的表数量,我们可以用如下命令查看其具体情况:
mysql> show global status like 'ope 47、n%tables%';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| Open_tables | 512 |
| Opened_tables | 234200 |
+---------------+--------+
2 rows in set (0.00 sec)
如果Opened_tables数量过大,说明配置中tables_caceh(MYSQL 5.1.3 之后这个值叫做table_open_cache)的值可能太小。我们查询一下服务器tab 48、le_cache值:
mysql> show variables like 'table_open_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| table_open_cache | 614 |
+------------------+-------+
1 row in set (0.00 sec)
比较合适的值为:
Open_tables / Opened_tables * 100% >= 85%
Op 49、en_tables / table_open_cache * 100% <= 95%
进程使用情况
如果我们在MYSQL服务器的配置文件中设置了thread-cache_size,当客户端断开之时,服务器处理此客户请求的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,我们可以用如下命令查看:
mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name | Value |
+--- 50、
| Threads_cached | 7 |
| Threads_connected | 2 |
| Threads_created | 2124 |
| Threads_running | 2 |
+-------------------+-------+
4 rows in set (0.00 sec)
如果发现Threads_created的值过大的话,表明MYSQL服务器一直在创建线程,这也是比较耗费资源的,可以适当增大配置文件中的thread_cache_size的值。查询服务器
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818