mysql性能的检查和调优方法

Posted on

mysql性能的检查和调优方法 - sudone.com服务器系统架构分析日志

sudone.com 服务器系统架构分析日志

mysql性能的检查和调优方法

[2012-08-02 15:22:04]

我一直是使用mysql这个数据库软件,它工作比较稳定,效率也很高。在遇到严重性能问题时,一般都有这么几种可能: 1、索引没有建好; 2、sql写法过于复杂; 3、配置错误; 4、机器实在负荷不了; 1、索引没有建好 如果看到mysql消耗的cpu很大,可以用mysql的client工具来检查。 在linux下执行 /usr/local/mysql/bin/mysql -hlocalhost -uroot -p 输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中。 看看当前的运行情况 show full processlist 可以多运行几次 这个命令可以看到当前正在执行的sql语句,它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息 在我的cache后端,这里面大部分时间是看不到显示任何sql语句的,我认为这样才算比较正常。如果看到有很多sql语句,那么这台mysql就一定会有性能问题 如果出现了性能问题,则可以进行分析: 1、是不是有sql语句卡住了? 这是出现比较多的情况,如果数据库是采用myisam,那么有可能有一个写入的线程会把数据表给锁定了,如果这条语句不结束,则其它语句也无法运行。 查看processlist里的time这一项,看看有没有执行时间很长的语句,要留意这些语句。 2、大量相同的sql语句正在执行 如果出现这种情况,则有可能是该sql语句执行的效率低下,同样要留意这些语句。 然后把你所怀疑的语句统统集合一下,用desc(explain)来检查这些语句。 首先看看一个正常的desc输出: mysql> desc select / from imgs where imgid=1651768337; +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | imgs | const | PRIMARY | PRIMARY | 8 | const | 1 | | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ 1 row in set (0.00 sec) 注意key、rows和Extra这三项,这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询,结果集数量为1条,Extra没有显示,证明没有用到排序或其他操作。由此结果可以推断,mysql会从索引中查询imgid=1651768337这条记录,然后再到真实表中取出所有字段,是很简单的操作。 key是指明当前sql会使用的索引,mysql执行一条简单语句时只能使用到一条索引,注意这个限制;rows是返回的结果集大小,结果集就是使用该索引进行一次搜索的所有匹配结果;Extra一般会显示查询和排序的方式,。 如果没有使用到key,或者rows很大而用到了filesort排序,一般都会影响到效率,例如: mysql> desc select / from imgs where userid="7mini" order by clicks desc limit 10; +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ | 1 | SIMPLE | imgs | ALL | NULL | NULL | NULL | NULL | 12506 | Using where; Using filesort | +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ 1 row in set (0.00 sec) 这条sql结果集会有12506条,用到了filesort,所以执行起来会非常消耗效率的。这时mysql执行时会把整个表扫描一遍,一条一条去找到匹配userid="7mini"的记录,然后还要对这些记录的clicks进行一次排序,效率可想而知。真实执行时如果发现还比较快的话,那是因为服务器内存还足够将12506条比较短小的记录全部读入内存,所以还比较快,但是并发多起来或者表大起来的话,效率问题就严重了。 这时我把userid加入索引: create index userid on imgs (userid); 然后再检查: mysql> desc select / from imgs where userid="7mini" order by clicks desc limit 10; +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | 1 | SIMPLE | imgs | ref | userid | userid | 51 | const | 8 | Using where; Using filesort | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ 1 row in set (0.00 sec) 嗯,这时可以看到mysql使用了userid这个索引搜索了,用userid索引一次搜索后,结果集有8条。然后虽然使用了filesort一条一条排序,但是因为结果集只有区区8条,效率问题得以缓解。 但是,如果我用别的userid查询,结果又会有所不同: mysql> desc select / from imgs where userid="admin" order by clicks desc limit 10; +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | 1 | SIMPLE | imgs | ref | userid | userid | 51 | const | 2944 | Using where; Using filesort | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ 1 row in set (0.00 sec) 这个结果和userid="7mini"的结果基本相同,但是mysql用userid索引一次搜索后结果集的大小达到2944条,这2944条记录都会加入内存进行filesort,效率比起7mini那次来说就差很多了。这时可以有两种办法可以解决,第一种办法是再加一个索引和判断条件,因为我只需要根据点击量取最大的10条数据,所以有很多数据我根本不需要加进来排序,比如点击量小于10的,这些数据可能占了很大部分。 我对clicks加一个索引,然后加入一个where条件再查询: create index clicks on imgs(clicks); mysql> desc select / from imgs where userid="admin" order by clicks desc limit 10; +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ | 1 | SIMPLE | imgs | ref | userid,clicks | userid | 51 | const | 2944 | Using where; Using filesort | +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+ 1 row in set (0.00 sec) 这时可以看到possible_keys变成了userid,clicks,possible_keys是可以匹配的所有索引,mysql会从possible_keys中自己判断并取用其中一个索引来执行语句,值得注意的是,mysql取用的这个索引未必是最优化的。这次查询mysql还是使用userid这个索引来查询的,并没有按照我的意愿,所以结果还是没有什么变化。改一下sql加上use index强制mysql使用clicks索引: mysql> desc select / from imgs use index (clicks) where userid='admin' and clicks>10 order by clicks desc limit 10 +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | 1 | SIMPLE | imgs | range | clicks | clicks | 4 | NULL | 5455 | Using where | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ 1 row in set (0.00 sec) 这时mysql用到了clicks索引进行查询,但是结果集比userid还要大!看来还要再进行限制: mysql> desc select / from imgs use index (clicks) where userid='admin' and clicks>1000 order by clicks desc limit 10 +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | 1 | SIMPLE | imgs | range | clicks | clicks | 4 | NULL | 312 | Using where | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ 1 row in set (0.00 sec) 加到1000的时候结果集变成了312条,排序效率应该是可以接受。 不过,采用换索引这种优化方式需要取一个采样点,比如这个例子中的1000这个数字,这样,对userid的每个数值,都要去找一个采样点,这样对程序来说是很难办的。如果按1000取样的话,那么userid='7mini'这个例子中,取到的结果将不会是8条,而是2条,给用户造成了困惑。 当然还有另一种办法,加入双索引: create index userid_clicks on imgs (userid, clicks) mysql> desc select / from imgs where userid="admin" order by clicks desc limit 10; +----+-------------+-------+------+----------------------+---------------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+----------------------+---------------+---------+-------+------+-------------+ | 1 | SIMPLE | imgs | ref | userid,userid_clicks | userid_clicks | 51 | const | 2944 | Using where | +----+-------------+-------+------+----------------------+---------------+---------+-------+------+-------------+ 1 row in set (0.00 sec) 这时可以看到,结果集还是2944条,但是Extra中的filesort不见了。这时mysql使用userid_clicks这个索引去查询,这不但能快速查询到userid="admin"的所有记录,并且结果是根据clicks排好序的!所以不用再把这个结果集读入内存一条一条排序了,效率上会高很多。 但是用多字段索引这种方式有个问题,如果查询的sql种类很多的话,就得好好规划一下了,否则索引会建得非常多,不但会影响到数据insert和update的效率,而且数据表也容易损坏。 以上是对索引优化的办法,因为原因可能会比较复杂,所以写得比较的长,一般好好优化了索引之后,mysql的效率会提升n个档次,从而也不需要考虑增加机器来解决问题了。 但是,mysql甚至所有数据库,可能都不好解决limit的问题。在mysql中,limit 0,10只要索引合适,是没有问题的,但是limit 100000,10就会很慢了,因为mysql会扫描排好序的结果,然后找到100000这个点,取出10条返回。要找到100000这个点,就要扫描100000条记录,这个循环是比较耗时的。不知道会不会有什么好的算法可以优化这个扫描引擎,我冥思苦想也想不出有什么好办法。对于limit,目前直至比较久远的将来,我想只能通过业务、程序和数据表的规划来优化,我想到的这些优化办法也都还没有一个是万全之策,往后再讨论。 2、sql写法过于复杂 sql写法假如用到一些特殊的功能,比如groupby、或者多表联合查询的话,mysql用到什么方式来查询也可以用desc来分析,我这边用复杂sql的情况还不算多,所以不常分析,暂时就没有好的建议。 3、配置错误 配置里主要参数是key_buffer、sort_buffer_size/myisam_sort_buffer_size,这两个参数意思是: key_buffer=128M:全部表的索引都会尽可能放在这块内存区域内,索引比较大的话就开稍大点都可以,我一般设为128M,有个好的建议是把很少用到并且比较大的表想办法移到别的地方去,这样可以显著减少mysql的内存占用。 sort_buffer_size=1M:单个线程使用的用于排序的内存,查询结果集都会放进这内存里,如果比较小,mysql会多放几次,所以稍微开大一点就可以了,重要是优化好索引和查询语句,让他们不要生成太大的结果集。 另外一些配置: thread_concurrency=8:这个配置标配=cpu数量x2 interactive_timeout=30 wait_timeout=30:这两个配置使用10-30秒就可以了,这样会尽快地释放内存资源,注意:一直在使用的连接是不会断掉的,这个配置只是断掉了长时间不动的连接。 query_cache:这个功能不要使用,现在很多人看到cache这几个字母就像看到了宝贝,这是不唯物主义的。mysql的query_cache在每次表数据有变化的时候都会重新清理连至该表的所有缓存,如果更新比较频繁,query_cache不但帮不上忙,而且还会对效率影响很大。这个参数只适合只读型的数据库,如果非要用,也只能用query_cache_type=2自行用SQL_CACHE指定一些sql进行缓存。 max_connections:默认为100,一般情况下是足够用的,但是一般要开大一点,开到400-600就可以了,能超过600的话一般就有效率问题,得另找对策,光靠增加这个数字不是办法。 其它配置可以按默认就可以了,个人觉得问题还不是那么的大,提醒一下:1、配置虽然很重要,但是在绝大部分情况下都不是效率问题的罪魁祸首。2、mysql是一个数据库,对于数据库最重要考究的不应是效率,而是稳定性和数据准确性。 4、机器实在负荷不了 如果做了以上调整,服务器还是不能承受,那就只能通过架构级调整来优化了。 1、mysql同步。 通过mysql同步功能将数据同步到数台从数据库,由主数据库写入,从数据库提供读取。 我个人不是那么乐意使用mysql同步,因为这个办法会增加程序的复杂性,并常常会引起数据方面的错误。在高负荷的服务中,死机了还可以快速重启,但数据错误的话要恢复就比较麻烦。 2、加入缓存 加入缓存之后,就可以解决并发的问题,效果很明显。如果是实时系统,可以考虑用刷新缓存方式使缓存保持最新。 在前端加入squid的架构比较提倡使用,在命中率比较高的应用中,基本上可以解决问题。 如果是在程序逻辑层里面进行缓存,会增加很多复杂性,问题会比较多而且难解决,不建议在这一层面进行调整。 3、程序架构调整,支持同时连接多个数据库 如果web加入缓存后问题还是比较严重,只能通过程序架构调整,把应用拆散,用多台的机器同时提供服务。 如果拆散的话,对业务是有少许影响,如果业务当中有部分功能必须使用所有的数据,可以用一个完整库+n个分散库这样的架构,每次修改都在完整库和分散库各操作一次,或定期整理完整库。 当然,还有一种最笨的,把数据库整个完完整整的做拷贝,然后程序每次都把完整的sql在这些库执行一遍,访问时轮询访问,我认为这样要比mysql同步的方式安全。 4、使用 mysql proxy 代理 mysql proxy 可以通过代理把数据库中的各个表分散到数台服务器,但是它的问题是没有能解决热门表的问题,如果热门内容散在多个表中,用这个办法是比较轻松就能解决问题。 我没有用过这个软件也没有认真查过,不过我对它的功能有一点点怀疑,就是它怎么实现多个表之间的联合查询?如果能实现,那么效率如何呢? 5、使用memcachedb 数据库换用支持mysql的memcachedb,是可以一试的想法,从memcachedb的实现方式和层面来看对数据没有什么影响,不会对用户有什么困扰。 为我现在因为数据库方面问题不多,没有试验过这个玩意。不过,只要它支持mysql的大部分主要的语法,而且本身稳定,可用性是无需置疑的。 站名:sudone.com; 站长:Ayou; 服务器:ubuntu+nginx+squid+php

一个备份MySQL数据库的简单Shell脚本

Posted on

一个备份MySQL数据库的简单Shell脚本

本文翻译自 iSystemAdmin 的 《A Simple Shell Script to Backup MySQL Database

Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行。我们也可以逐一敲入命令手动执行。如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反复运行这些命令了。

我首先要在本文带给你的是完整脚本。后面会对该脚本做说明。我假定你已经知道shell scripting、 mysqldump和**crontab。**

适用操作系统:任何Linux或UNIX。

a-simple-shell-script-to-backup-mysql-database

主脚本(用于备份mysql数据库):

该Shell脚本可以自动备份数据库。只要复制粘贴本脚本到文本编辑器中,输入数据库用户名、密码以及数据库名即可。我备份数据库使用的是mysqlump 命令。后面会对每行脚本命令进行说明。

1. 分别建立目录“backup”和“oldbackup” 1

2 /#mkdir /backup

/#mkdir /oldbackup

2. 现在使用你喜欢的编辑软件创建并编辑“backup.sh”

这里我用的是 vi 1 /# vi /backup/backup.sh

现在把以下几行命令输入到 backup.sh 文件中:

1

2 3

4 5

6 7

8 9 /#!bin/bash

cd

/backup echo

“You are In Backup Directory”

mv

backup/*

/oldbackup echo

“Old Databases are Moved to oldbackup folder”

Now=$(

date

+”%d-%m-%Y--%H:%M:%S”) File=backup-$Now.sql

mysqldump –u user-name –p ‘password’ database-name > $File echo

“Your Database Backup Successfully Completed”

脚本说明:

切记,在第8行命令中,在mysqldump命令后要输入自己的数据库用户名、密码及数据库名。

执行该脚本,首先会进入 /backup 目录,然后该脚本会把原有的旧数据库备份移动到 /oldbackup 文件夹中,接着根据系统的日期及时间生成一个文件名,在最后 mysqldump 命令会生成一个“.sql”格式的数据库备份文件。

3. 设置 backup.sh 脚本文件的可执行许可 1 /# chmod +x /backup/backup.sh

4. 执行脚本

1 /#./backup.sh

脚本运行结束后会得到以下输入。

1

2 3

4 5 root@Server1:

/download

/#./backup.sh

You areinDownload Directory Old Backup DatabaseisMoved to oldbackup folder

database backup successful completed root@Server1:

/download

/#

注:首次执行该脚本会有一个“no such file”的提示信息,这是由于旧备份文件还不存在。只要再次执行该脚本就没有问题了,这个问题已经不存在了。

5. 使用cron制订备份计划

使用Cron可以定时执行该脚本,备份会自动完成。使用 crontab 命令编辑cron 执行的计划任务。 1 /#crontab –e

只要在编辑器上加入下面这一行代码保存即可。

1 013/ / / /

/backup/backup

.sh

本任务表示的是在每天下午1点钟把数据库备份到指定的文件夹。有关cron任务设置的详细内容可以查阅crontab手册。

对初学者而言,这是非常基础的脚本。希望你能举一反三写出更复杂的备份脚本。我们会努力提供更自动化的新脚本。请大家不吝赐教,我们会尽力解决你们的问题。感谢与我们相伴。 来源: [http://blog.jobbole.com/18005/](http://blog.jobbole.com/18005/)

A Simple Shell Script to Backup MySQL DataBase

The Shell script is a script where we are writing different types of commands and executing those commands from a single file. We can execute that command manually, by entering command one by one. But if we use shell script we have to write those commands into a text file for the first time and then we can run those commands as many times as required.

In this article first I will show you, Complete Script. Later on, you will get a description of that script. I assumed that you know about shell scripting, mysqldump and crontab.

Operating System: Any Linux or UNIX.

Main Script (for backup your MySQL database):

This shell script will make the backup process of a database automatic. Just copy and paste this script in a text editor, put database user name, password, and database name. I will use mysqlump command to backup the database. Later on you will get description of each line. 1. Make a directory name “backup” and “oldbackup”

1

2 /#mkdir /backup

/#mkdir /oldbackup 2. Now make file name “backup.sh” and edit with any editor you like

I’m using vi here-

1 /# vi /backup/backup.sh

Now write these lines into backup.sh file:

/#!bin/bash

cd /backup echo “You are In Backup Directory”

mv backup/* /oldbackup echo “Old Databases are Moved to oldbackup folder”

Now=$(date +”%d-%m-%Y--%H:%M:%S”) File=backup-$Now.sql

mysqldump –u user-name –p ‘password’ database-name > $File echo “Your Database Backup Successfully Completed”

Script Description:

Remember, in line number 8: Put your Database username, Password, database name after mysqldump command.

When we run this script, first it goes to a /backup directory. Then it will move old database backup files to /oldbackup folder. Next it generates a file name from system date and time. And finally mysqldump command will generate a database backup file with “.sql” format 3. Set permission to backup.sh file executable

1 /# chmod +x /backup/backup.sh 4. Running the Script

1 /#./backup.sh

You will get following output after executing the script. root@Server1:/download/#./backup.sh

You are in Download Directory Old Backup Database is Moved to oldbackup folder

database backup successful completed root@Server1:/download/#

NB: first time when you run this script you will get a message “no such file”, because you don’t have old backup file. No problem just runs again this script, problem will be solved.

5. Schedule the Backup using cron

Using Cron job you can execute this script in a certain time, and all works will be done automatically. Use crontab command to edit editing cron schedules.

/#crontab –e

Just add below line in the editor and save it. 0 13 / / / / /backup/backup.sh

In this way every day 1PM your database will back up in your desired folder. Please visit crontab manuals for more details about setting the cron jobs.

This is a very basic script for the beginners. Hope you can use the same idea for more complex backup. We will try to come up with new scripts to automate further. Please ask any question you have. We will try our best to address your questions. Thanks for staying with us.

No Related Posts

#

Sifat is a veteran System Administrator who still loves to make his hand dirty with text consoles. Sifat has 14 years of Operations and Management experience in IT and telecommunication industries.He has proven record of IT planning, Policy Development, IT Process Management, Cost Control and successful leadership for effective and efficient IT organization. He is effective in reducing Capital and Operation Expense by H/W & Software consolidation and virtualization. Sifat is a certified ITIL and VMWare Professional.

View all posts by Sifat →

来源: [http://isystemadmin.com/a-simple-shell-script-to-backup-mysql-database](http://isystemadmin.com/a-simple-shell-script-to-backup-mysql-database)

为MySQL选择合适的备份方式

Posted on

为MySQL选择合适的备份方式

[

mysql 5.1同步到5.5卡库问题一则 ](http://nettedfish.sinaapp.com/blog/2013/02/22/51-55-slave-sql-thread-error/ "mysql 5.1同步到5.5卡库问题一则")[

一键搭建blackhole从库 ](http://nettedfish.sinaapp.com/blog/2012/10/19/auto-build-blackhole-slave "一键搭建blackhole从库")[

如何产生唯一的server id ](http://nettedfish.sinaapp.com/blog/2013/07/24/how-to-generate-unique-server_id/ "如何产生唯一的server id")[

如何生成唯一的server id ](http://nettedfish.sinaapp.com//blog/2013/07/24/how-to-generate-unique-server_id/ "如何生成唯一的server id")

友荐[?]

返回顶部猜你喜欢 [

mysql 5.1同步到5.5卡库问题一则 ](http://nettedfish.sinaapp.com/blog/2013/02/22/51-55-slave-sql-thread-error/ "mysql 5.1同步到5.5卡库问题一则")[

金泫雅清新素颜照 ](http://www.cmsbs.com/pic/zp/4993.html "金泫雅清新素颜照")[

学生办理签证重要的标准 ](http://www.cmsbs.com/eut/luixue/5105.html "学生办理签证重要的标准")[

深田恭子艳丽沙滩迷情写真 ](http://www.cmsbs.com/pic/hot/5228.html "深田恭子艳丽沙滩迷情写真")[

李颖芝穿金色比基尼与保时捷亲密接触 ](http://www.cmsbs.com/pic/xg/5166.html "李颖芝穿金色比基尼与保时捷亲密接触")

友荐[?]

返回顶部猜你喜欢

Learn and Share

陌上发花,可以缓缓醉矣, 忍把浮名,换了浅酌低唱

2013年-05月-31日 16:01:00 数据库的备份是极其重要的事情。如果没有备份,遇到下列情况就会抓狂:

UPDATE or DELETE whitout where…

table was DROPPed accidentally…

INNODB was corrupt…

entire datacenter loses power…

从数据安全的角度来说,服务器磁盘都会做raid,MySQL本身也有主从、drbd等容灾机制,但它们都无法完全取代备份。容灾和高可用能帮我们有效的应对物理的、硬件的、机械的故障,而对我们犯下的逻辑错误却无能为力。每一种逻辑错误发生的概率都极低,但是当多种可能性叠加的时候,小概率事件就放大成很大的安全隐患,这时候备份的必要性就凸显了。那么在众多的MySQL备份方式中,哪一种才是适合我们的呢?

常见的备份方式

MySQL本身为我们提供了mysqldump、mysqlbinlog远程备份工具,percona也为我们提供了强大的Xtrabackup,加上开源的mydumper,还有基于主从同步的延迟备份、从库冷备等方式,以及基于文件系统快照的备份,其实选择已经多到眼花缭乱。而备份本身是为了恢复,所以能够让我们在出现故障后迅速、准确恢复的备份方式,就是最适合我们的,当然,同时能够省钱、省事,那就非常完美。下面就我理解的几种备份工具进行一些比较,探讨下它们各自的适用场景。

1. mysqldump & mydumper

mysqldump是最简单的逻辑备份方式。在备份myisam表的时候,如果要得到一致的数据,就需要锁表,简单而粗暴。而在备份innodb表的时候,加上–master-data=1 –single-transaction 选项,在事务开始时刻,记录下binlog pos点,然后利用mvcc来获取一致的数据,由于是一个长事务,在写入和更新量很大的数据库上,将产生非常多的undo,显著影响性能,所以要慎用。

  • 优点:简单,可针对单表备份,在全量导出表结构的时候尤其有用。
  • 缺点:简单粗暴,单线程,备份慢而且恢复慢,跨IDC有可能遇到时区问题。 mydumper是mysqldump的加强版。相比mysqldump:
  • 内置支持压缩,可以节省2-4倍的存储空间。
  • 支持并行备份和恢复,因此速度比mysqldump快很多,但是由于是逻辑备份,仍不是很快。

2. 基于文件系统的快照

基于文件系统的快照,是物理备份的一种。在备份前需要进行一些复杂的设置,在备份开始时刻获得快照并记录下binlog pos点,然后采用类似copy-on-write的方式,把快照进行转储。转储快照本身会消耗一定的IO资源,而且在写入压力较大的实例上,保存被更改数据块的前印象也会消耗IO,最终表现为整体性能的下降。而且服务器还要为copy-on-write快照预留较多的磁盘空间,这本身对资源也是一种浪费。因此这种备份方式我们使用的不多。

3. Xtrabackup

这或许是最为广泛的备份方式。percona之所以家喻户晓,Xtrabackup应该功不可没。它实际上是物理备份+逻辑备份的组合。在备份innodb表的时候,它拷贝ibd文件,并一刻不停的监视redo log的变化,append到自己的事务日志文件。在拷贝ibd文件过程中,ibd文件本身可能被写”花”,这都不是问题,因为在拷贝完成后的第一个prepare阶段,Xtrabackup采用类似于innodb崩溃恢复的方法,把数据文件恢复到与日志文件一致的状态,并把未提交的事务回滚。如果同时需要备份myisam表以及innodb表结构等文件,那么就需要用flush tables with lock来获得全局锁,开始拷贝这些不再变化的文件,同时获得binlog位置,拷贝结束后释放锁,也停止对redo log的监视。 它的工作原理如下: 由于mysql中不可避免的含有myisam表,同时innobackup并不备份表结构等文件,因此想要完整的备份mysql实例,就少不了要执行flush tables with read lock,而这个语句会被任何查询(包括select)阻塞,在阻塞过程中,它又反过来阻塞任何查询(包括select)。如果碰巧备份实例上有长查询先于flush tables with read lock执行,数据库就会hang住。而当flush tables with read lock获得全局锁后,虽然查询可以执行,但是仍会阻塞更新,所以,我们希望flush tables with read lock从发起到结束,持续的时间越短越好。 为了解决这个问题,有两种比较有效的方法:

1. 尽量不用myisam表。

2. Xtrabackup增加了–rsync选项,通过两次rsync来减少持有全局锁的时间。

优化后的备份过程如下:

  • 优点:在线热备,全备+增备+流备,支持限速,支持压缩,支持加密。
  • 缺点:需要获取全局锁,如果遇到长查询,等待时间将不可控,因此要做好监控,必要时杀死长查询或自杀;遇到超大的实例,备份过程较长,redo log太大会影响恢复速度,这种情况下最好采用延迟备份。

4. mysqlbinlog 5.6

上述所有的备份方式,都只能把数据库恢复到备份的某个时间点:mysqldump和mydumper,以及snapshot是备份开始的时间点;Xtrabackup是备份结束的时间点。要想实现point in time的恢复,还必须备份binlog。同时binlog也是实现增备的宝贵资源。 幸运的是,mysql 5.6为我们提供了远程备份binlog的选项:

mysqlbinlog --raw --read-from-remote-server --stop-never 它会伪装成mysql从库,从远程获取binlog然后进行转储。这对线上主库容量不够无法保存较多binlog的场景非常有用。但是,它毕竟不像真正的mysql从库实例,状态监控和同步都需要单独部署。因此个人觉得采用blackhole来备份全量的binlog是更好的选择。笔者曾经实现过一个自动搭建blackhole从库的工具,稍加修改,就可以完美搭建出blackhole从库。一旦同步起来,基本一劳永逸,很少出问题,主从切换的时候跟着切了就行。

提示:

  • 不要小看binlog的备份。当5.6的多线程复制大规模使用后,从库追赶主库命令点的耗时将被极大缩短,这样我们把每天一次的全量备份改为每3天一次、甚至每周一次的全量备份,和持续的binlog增量备份。遇到故障需要恢复数据的时候,重放3、5天的binlog也是极快的。降低备份频率最直接的好处是,省钱、省事。
  • blackhole对于备份binlog是极好的。一方面可以长久的备份binlog用于恢复数据库,另一方面,在其上配置半同步复制,可以有效防止主库的binlog丢失。

总结

备份方式各有千秋,而对我们来说,面对数千实例,选择合适的备份工具来实现统一配置、统一规划,构建智能调度的备份云平台才是王道。毕竟,多种备份方式共存的运维成本是不容忽视的。 从使用经验来看,用Xtrabackup全备数据,用blackhole增备binlog,并定期对备份数据的有效性进行验证,是当下比较好的选择。

Posted by nettedfish 2013年-05月-31日 16:01:00 mysql

« mysql 5.1同步到5.5卡库问题一则 用pt-table-checksum校验数据一致性 » 友荐云推荐

共有1人喜欢 共3条评论 登录社区

头衔:确定取消

编辑头衔 邮箱:确定取消

跟踪回复

0条评论

0次被喜欢 发表评论

请输入你的评论 表情

  • 默认表情
  • 阿狸

140 发 布

按时间排序

排序方式:按时间排序按热度排序

jianfengye110 (新浪微博)

推荐~~ 回复

22小时前

sin30_net (新浪微博)

微博转发:转发微博 回复

22小时前

vvsherry (新浪微博)

回复 顶1

6月1日 00:44

更多热评文章

[*

mysql 5.1同步到5.5卡库问题一则](http://nettedfish.sinaapp.com/blog/2013/02/22/51-55-slave-sql-thread-error/ "mysql 5.1同步到5.5卡库问题一则")

[*

一键搭建blackhole从库](http://nettedfish.sinaapp.com/blog/2012/10/19/auto-build-blackhole-slave "一键搭建blackhole从库") [*

如何产生唯一的server id](http://nettedfish.sinaapp.com/blog/2013/07/24/how-to-generate-unique-server_id/ "如何产生唯一的server id")

[*

如何生成唯一的server id](http://nettedfish.sinaapp.com//blog/2013/07/24/how-to-generate-unique-server_id/ "如何生成唯一的server id") 友言[?]

请输入你的评论 表情

  • 默认表情
  • 阿狸 140

回 复

nettedfish.sinaapp.com

43 评论数

8 喜欢数 21 用户数 数据正在加载中...

友言

社会化帐号登录

点击按钮,使用社交帐号评论

新浪微博 腾讯微博 人人网 网易微博 搜狐微博 开心网

作为游客留言

Email /*

昵 称 顶并分享到:

新浪微博 新浪微博

新浪微博 取消

qunar诚招MySQL DBA

最新发表

分类目录

GitHub Repos

德州扑克筹码计算工具

gnuplot作图的一些例子

一键搭建blackhole从库

psutil

开源的纯python写的nosql数据库,学习 @nettedfish on GitHub

友情链接

Copyright © 2013 - nettedfish - Powered by Octopress

使用java实现自动备份mysql数据库

Posted on

使用java实现自动备份mysql数据库 - 苳眠的牧场 - ITeye技术网站

首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼

招聘 搜索

您还未登录 ! 登录 注册

苳眠的牧场

使用java实现自动备份mysql数据库 **

博客分类:

  • mysql mysql数据库备份java

     Last modified:2013-05-02 16:55:01
    
    /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
    
     在实际应用中,定时备份数据库是一件非常重要的工作,下面是关于利用java程序实现数据库自动调用的方法,其实也不一定非要用java语言了,只要原理会了,大家大可使用其他语言来实现。话不多说,下面就来演示一下如何**自动备份mysql下的abc数据库**:
    

1,在java API中为我们提供了一个Runtime类,它可以用来调用一些程序,比如notepad.exe,cmd.exe...

具体怎么回事,想了解的同学去看API吧,下面是实现代码:Backup.java

Java代码 收藏代码

  1. import java.util.Calendar;
  2. import java.util.Date;
  3. import java.text.SimpleDateFormat;
  4. import java.io.IOException;
  5. import java.io.PrintStream;
  6. public class Backup
  7. {
  8. public static void main(String[] args)
  9. {
  10. Runtime runtime = Runtime.getRuntime();
  11. Calendar calendar = Calendar.getInstance();
  12. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
  13. String currentTime = dateFormat.format(calendar.getTime());
  14. Process p = null;
  15. PrintStream print = null;
  16. StringBuilder buf = new StringBuilder();
  17. for(String a : args){
  18. buf.append(a);
  19. buf.append(" ");
  20. }
  21. String databases = buf.toString();
  22. System.out.println(databases);
  23. try{
  24. p = runtime.exec("cmd /c mysqldump -uroot -p1234 -B "+databases+">"+currentTime+".sql.bak");
  25. }catch (IOException e){
  26. if( p != null ){
  27. p.destroy();
  28. }
  29. try{
  30. print = new PrintStream(currentTime+"_backup_err.log");
  31. dateFormat.applyPattern("yyyy-MM-dd HH:mm:ss");
  32. currentTime = dateFormat.format(calendar.getTime());
  33. print.println(currentTime+" backup failed.");
  34. e.printStackTrace(print);
  35. print.flush();
  36. }catch (IOException e2){
  37. }finally{
  38. if(print!=null){
  39. print.close();
  40. }
  41. }
  42. }
  43. }
  44. }
    import java.util.Calendar; import java.util.Date; import java.text.SimpleDateFormat; import java.io.IOException; import java.io.PrintStream; public class Backup { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); String currentTime = dateFormat.format(calendar.getTime()); Process p = null; PrintStream print = null; StringBuilder buf = new StringBuilder(); for(String a : args){ buf.append(a); buf.append(" "); } String databases = buf.toString(); System.out.println(databases); try{ p = runtime.exec("cmd /c mysqldump -uroot -p1234 -B "+databases+">"+currentTime+".sql.bak"); }catch (IOException e){ if( p != null ){ p.destroy(); } try{ print = new PrintStream(currentTime+"_backup_err.log"); dateFormat.applyPattern("yyyy-MM-dd HH:mm:ss"); currentTime = dateFormat.format(calendar.getTime()); print.println(currentTime+" backup failed."); e.printStackTrace(print); print.flush(); }catch (IOException e2){ }finally{ if(print!=null){ print.close(); } } } } }

2,将以上java程序编译后得到Backup.class文件;

3,创建批处理文件mytask.bat: Bat代码 收藏代码

  1. @echo off
  2. cd c:\backup_wj
  3. rem 这里提倡使用绝度路径,并且如果绝度路径中有空格,记得用
  4. rem 引号将路径括起来!
  5. rem 可以将abc替换为其他数据库,多多个数据库,并用空格隔开
  6. "D:\Program Files\Java\jdk1.6.0_31\bin\java.exe" Backup abc
    @echo off cd c:\backup_wj rem 这里提倡使用绝度路径,并且如果绝度路径中有空格,记得用 rem 引号将路径括起来! rem 可以将abc替换为其他数据库,多多个数据库,并用空格隔开 "D:\Program Files\Java\jdk1.6.0_31\bin\java.exe" Backup abc

3.1:根据评论我又发现了一个新的方法,不需要使用java,直接写一个批处理文件就可以实现自动备份功能,读者可以直接使用下面的批处理文件代替原来的批处理文件,不需要在使用java了,然后按照下面的步骤制订计划任务就可以了,代码如下: Bat代码 收藏代码

  1. mysqldump -uroot -p1234 -B abc > %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.sql.bak
    mysqldump -uroot -p1234 -B abc > %date:~0,4%%date:~5,2%%date:~8,2%
    %time:~0,2%%time:~3,2%%time:~6,2%.sql.bak

4,将Backup.class、mytask.bat放到同一个目录下,比如我就放在了c:\backup_wj目录下

5,在win7下配置任务计划,下面照着步骤一步一步走就行了:

5.1:在控制面板下找到“管理工具”——》“任务计划程序”

5.2:选择“任务计划程序库”——》“创建基本任务”

5.3:填写任务名称和描述

5.4:下面根据向导的描述操作就可以了;

5.5:点击“浏览”选择批处理文件“mytask.bat”;

5.6:点击“完成”后,选中autoBackup,点击“运行”测试一下:

是不是有一个黑窗口一闪而过,好的那么打开你存放backup.bat的目录看一看,是不是生成了一个备份文件呢?

下面是我的,不过我们的备份文件已经生成了4次,从文件名就可以看出生成的时间。

那么其中的原理大家都会了吧,其实就是让我们的操作系统定时去执行一个批处理文件“Backup.bat”,而这个批处理文件会去执行一个.class文件,这是一个java可执行文件,它会调用runtime.exec()方法,在命令行下执行一段命令,这段命令就是备份数据库的命令。

注意:对于备份的时间,我们可以设置得更加精细,通过“编辑触发器”中的“重复任务间隔”我们可以精确到每5分钟重复执行一次。具体怎么设置大家可以根据实际情况来设置。

  • 大小: 65.5 KB

  • 大小: 53.9 KB

  • 大小: 79.5 KB

  • 大小: 39 KB

  • 大小: 34.2 KB

  • 大小: 30.9 KB

  • 大小: 31.8 KB

  • 大小: 34.1 KB

  • 大小: 52.6 KB

  • 大小: 36.3 KB

  • 大小: 48.2 KB

  • 大小: 64.3 KB

  • 大小: 44.2 KB

  • 大小: 83.7 KB

  • 查看图片附件

7

5

分享到: 关于工资的三个秘密

7 楼 kjj 4 小时前

如果是java,我以为你要一条条读取,原来回头来调用mysqldump ,直接at搞定算了! 6 楼 wangjie2013 16 小时前

freezingsky 写道

mysql自身就可以实现了,实在没必要用其他的任何语言来附加,有种多余的感觉 。 mysql提供指令自动备份了吗?怎么做呀??

5 楼 freezingsky 16 小时前

mysql自身就可以实现了,实在没必要用其他的任何语言来附加,有种多余的感觉 。 4 楼 wangjie2013 19 小时前

RamosLi 写道

一行命令就能搞定: at xx:xx /every:date mysqldump xxx 命令格式自己查吧 at/? 那么如果要实现每天多次备份是不是执行多次at命令,更改为不同的时间就可以了呀? 还有,,,,怎么停止呢?

3 楼 RamosLi 19 小时前

一行命令就能搞定: at xx:xx /every:date mysqldump xxx 命令格式自己查吧 at/? 2 楼 wangjie2013 20 小时前

cgs1999 写道

使用java有点多余,其实可以新建一个批处理文件backup.bat,内容如下: Java代码 收藏代码

  1. mysqldump -uroot -p1234 -B abc>%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.sql.bak
    mysqldump -uroot -p1234 -B abc>%date:~0,4%%date:~5,2%%date:~8,2%
    %time:~0,2%%time:~3,2%%time:~6,2%.sql.bak 同样使用系统的“计划任务”实现定时备份 哈哈 你还真想的出来!哈哈 我本来也想过看看有系统有没有提供获取完整时间的方法,就查到date和time,不过没想到你拼出来了,哈哈。

1 楼 cgs1999 22 小时前

使用java有点多余,其实可以新建一个批处理文件backup.bat,内容如下: Java代码 收藏代码

  1. mysqldump -uroot -p1234 -B abc>%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.sql.bak
    mysqldump -uroot -p1234 -B abc>%date:~0,4%%date:~5,2%%date:~8,2%
    %time:~0,2%%time:~3,2%%time:~6,2%.sql.bak 同样使用系统的“计划任务”实现定时备份

发表评论

您还没有登录,请您登录后再发表评论

wangjie2013的博客

wangjie2013

小网客的博客

小网客

GoodWell的博客

GoodWell haiwuyanlzh的博客

haiwuyanlzh

hubert_bubert的博客

hubert_bubert

文章分类

存档分类

最新评论

  • wangjie2013: s1318601 写道讲下优点和适用范围及实际情况呗建议不错, ... 单例设计模式
  • s1318601: 讲下优点和适用范围及实际情况呗 单例设计模式
  • wangjie2013: yekui 写道买就不用了 ,直接去CSDN上去下就好了。地址 ... 试读《征服C指针》
  • wangjie2013: yekui 写道只是只有存在你脑子里才是有价值的,并不是说买来 ... 试读《征服C指针》
  • yekui: 只是只有存在你脑子里才是有价值的,并不是说买来的书,知识就能自 ... 试读《征服C指针》 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。 © 2003-2012 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]

This ad is supporting your extension Allow Right-Click: More info | Privacy Policy | Hide on this page

建立mysql可远程连接root权限用户

Posted on

建立mysql可远程连接root权限用户-电脑知识网-电脑基础知识

生活百宝箱 | IT术语解释 | Alexa排名查询 | PR 值查询 | 在线代理 | IP地址查询 | 在线翻译 | 邮政系统查询 | 火车票在线查询 | 万年历 | 颜色选择器 | 常用网页小图标

主板 | CPU | 硬盘 | 内存 显卡 | 声卡 | 网卡 | 显示器 | 机箱 | 音响 | 摄像头 路由器 | 交换机 | 服务器 | 打印机 | 复印机 | 传真机 | 网线 | 水晶头 更多专题… 杀毒 | 教程 | 注册表 | 组策略 | DOS | 网络组建 | 电脑组装 | QQ空间 | 中国百科

[繁体版] 订阅 | 网站首页 | 新闻中心 | 系统知识 | 网络安全 | 平面动画 | 网站程序 | 数据库 | 报错查询 | 注册码 | 网站模板 | 网站优化 | 图库 | 下载 | [电脑论坛]

>> 您现在的位置: 电脑知识网 >> 数据库 >> Mysql >> 正文 建立mysql可远程连接root权限用户 双击自动滚屏 【字体: 】 建立mysql可远程连接root权限用户 电脑知识网为您报时:今天是

 以下语句具有和ROOT用户一样的权限。大家在拿站时应该碰到过。root用户的mysql,只可以本地连,对外拒绝连接。以下方法可以帮助你解决这个问题了,下面的语句功能是,建立一个用户为itpro 密码123 权限为和root一样。允许任意主机连接。这样你可以方便进行在本地远程操作数据库了。

CREATE USER 'itpro'@'%' IDENTIFIED BY '123';

GRANT ALL PRIVILEGES ON /./ TO 'itpro'@'%' IDENTIFIED BY '123'WITH GRANT OPTION

MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0

MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

搞完事记得删除脚印哟。

DROP USER 'itpro'@'%';

DROP DATABASE IF EXISTS itpro ; 我想对电脑方面的知识提问 我想撰写关于电脑知识方面的文章 我想对生活方面的知识提问 我想撰写生活方面的文章 推荐视频: Windows Vista安装 Windows XP安装 设置BIOS 硬盘分区 经典FLASH动画视频教程 Photoshop视频教程 Dreamweaver视频教程 C语言视频 DOS 视频教程 (黑客入门) 推荐工具: 手机号、身份证、区号查询 城市地图 计算器 火车查询 健康指数查询 许愿树 爱墙祝福 Q爱 flash小游戏 站长工具: IP查询 PR 值查询 Alexa排名查询 网站运营 百度优化 Google优化 Alexa排名 更多…… 推荐网站: 健康者(健康类型网站) PCWindows(系统学习) 第三导航(协助上网) Flash小游戏(小游戏) 人人健康(rrjk.com.cn) 我爱PC(5apc.cn) * 上一篇数据库: MySQL数据库函数详解(目录)