最近公司项目需要,要备份Mysql数据库,由于项目的数据库个数很多有300多个,所以希望写一个工具完成备份还原操作。网上搜查了一下资料MySql备份,最简最快的方法是直接拷贝文件,但是这种方法可能在不同版本的MySql中还原出现问题,具体怎么操作,复制的文件在哪找,我也没有去认真考究,网上很多人提到直接复制法但都没有说明具体的操作步骤,希望有试过的人可以和大家分享下你的想法。而我选择的是用MySql自带的工具mysqldump.exe,我会分两部分介绍,第一部分介绍cmd命令备份还原,第二部分,具体在c#中如何实现和制作一个批量备份还原工具。下面开始介绍mysqldump工具的命令使用方法先。
mysqldump.exe这个程序大家可以在~MySQLMySQL Server 5.5bin中找到,而我的在C:Program FilesMySQLMySQL Server 5.5bin中,下面以此为例,使用cmd命令操作。打开cmd输入命令 cd C:Program FilesMySQLMySQL Server 5.5bin 回车进入操作目录,现在我们可以输入命令 mysqldump --help回车查看mysqldump的帮助说明。我简单介绍可能用到的参数如下:
--host=value或-hvalue :这个参数是指定mysql服务器的地址,value就是具体地址,注意u和value之间没空格,例如--host=192.168.1.111或--hlocalhost
--user=value 或-uvalue :指定mysql的账号登录名,value就是具体的账号名 ,如-uroot
--password=value或-pvalue: 指定mysql的登录密码;
--port :mysql端口号,默认3306
--default-character -sets=value :指定字符编码类型 如:--default-character -sets=utf8,这里要根据自己配置的实际情况设定,否则导出的数据会乱码
--force 或-f :即使我们在一个表倾倒期间得到一个SQL错误,继续。
--qucik 或 -q:选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--lock-tables :锁定当前导出的数据表,而不是一下子锁定全部库下的表。注意有个说明 :只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项,具体两种表有什么区别,如何区分我也不清楚。
--no-data 或 -d :不导出任何数据,只导出数据库表结构。
--routines 或 -R :导出存储过程以及自定义函数。
--opt :这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
其他的选项自己查资料吧。下面我们开始写一条导出数据的命令:
输入:mysqldump -hlocalhost -uroot -proot --default-character-set=utf8 --lock-tables --routines --force --quick Dbname>d:backup.sql
回车 (Dbname为要导出的数据库的名称,d:backup.sql为导出的数据存放的地方,上面那条命令导出了库中所有表的结构和数据,以及函数和存储过程)
如果要只导出结构不要数据那么加个-d参数即可。
下面说说导出的数据如何恢复呢。恢复时我们用到mysql.exe程序,同样启动cmd,进入C:Program FilesMySQLMySQL Server 5.5bin目录(输入:cd :Program FilesMySQLMySQL Server 5.5bin)然后输入还原命令如下:
mysql --hlocalhost -uroot -proot --default-character-set=utf8 Dbname<d:backup.sql 回车即可(Dbname是要还原到的数据库的名称,注意一定要存在,不存在则要先新建);那么怎么用命令新建呢?网上少提到具体怎么通过cmd一条命令完成,因为我也走了很多弯路,所以我在此提一下:
通过mysql --help 你可以查看到一个参数选项 :-e,--execute=name ,这个选项可以执行sql语句,name就是具体的语句,注意这里name要用引号引起来,否则不能执行,我也是弄了好久才发现这个原因,例如输入:
mysql --hlocalhost -uroot -proot --default-character-set=utf8 -execute=“create database if not exists Dbname ;" 回车,即可创建Dbname数据库
好了第一部分讲完了,脖子痛啊 ,不适用那么那么长时间打字啊,第一次写博客还真有点累,休息下,下会继续~~~