在数据库运行时维护数据库
执行mysql数据库维护的方法之一就是连接mysql服务器,并告诉它做什么事,
如对myisam数据表进行检查或者修复, 可以使用check table tbname或repar table tbname(或者运行sqlcheck程序)让mysql服务器去做这项工作。
mysql> check table role;
+-----------+-------+----------+-------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------+-------+----------+-------------------------------------------------------+
| test.role | check | warning | 1 client is using or hasn't closed the table properly |
| test.role | check | status | OK |
+-----------+-------+----------+-------------------------------------------------------+
2 rows in set (0.01 sec)
mysql> repair table role;
+-----------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+--------+----------+----------+
| test.role | repair | status | OK |
+-----------+--------+----------+----------+
1 row in set (0.00 sec)
使用mysqlcheck检查表
-c, --check (检查表);
-r, --repair(修复表);
-a, --analyze (分析表);
-o, --optimize(优化表);
[root@host test]# mysqlcheck -uroot -proot test role -a
test.role Table is already up to date
[root@host test]# mysqlcheck -uroot -proot test role -c
test.role OK
检查一个表
[root@host test]# mysqlcheck -uroot -proot test role
test.role OK
检查一个库
[root@host test]# mysqlcheck -uroot -proot test
test.gamelog OK
test.log1 OK
test.log2 OK
test.log_merge OK
test.loginlog OK
test.name_test OK
test.name_test1 OK
test.role OK
检查所有库
[root@host test]# mysqlcheck -uroot -proot -A -c
metastore.BUCKETING_COLS OK
metastore.CDS OK
..................................
metastore.VERSION OK
mysql.columns_priv OK
mysql.proc OK
mysql.procs_priv OK
mysql.servers OK
mysql.slow_log
test.name_test1 OK
test.role OK
........................
执行mysql维护操作的另一种方法,使用不依赖mysql服务器的外部程序.如myisamchk,在使用它修复表示,一定要保证mysql服务器不会在期间访问它,不然会导致更严重问题。
不行让mysql服务器打扰你,最有效分方式就是关掉mysql服务器。呵呵
如果不想关掉mysql服务器,又不想mysql服务器与外部程序相互干扰,必须使用锁定机制与服务器进行协调。
mysql提供了两种锁定机制。
内部锁定机制,mysql服务器使用这一机制防止来自不同客户程序的查询请求相互混乱和干扰;
外部锁定机制,mysql服务器使用这一机制防止其他程序修改它正在使用的数据表文件;
以只读方式或读/写方式锁定一个或者多个数据表
mysql服务器利用内部锁定机制阻止它访问你正在处理的数据表,基本思路就是用mysql程序连接到mysql服务器并发出一条lock table的语句锁定你打算使用的数据表,然后把这个mysql会话闲置在那里,你数据表文件做你想做的事情;完成之后切换回mysql会话并释放锁定的数据表,让mysql服务器可以重新使用它。如果发出锁定语句的mysql回话被关闭,则锁定也会随之失效。
如果检查或者复制某个文件,只读方式锁定就足够了。
如果修改某个文件,应该以读写方式锁定。
lock table xxx read,只读方式锁住xxx,该表只能被select,不能被修改。如果在lock时,该表上存在事务,则lock语句挂起,直到事务结束。多个会话可以同时对表执行该操作。
lock table xxx write,读写方式锁住xxx,lock table的会话可以对表xxx做修改及查询等操作,而其他会话不能对该表做任何操作,包括select也要被阻塞。
还可以使用flush table xxx通知mysql服务器把挂起的改动写入硬盘.解锁前再次flush table xxx
show open tables;列举在表缓存中当前被打开的非TEMPORARY表。
mysql> select connection_id(); 用于查看当前用户的连接数
+-----------------+
| connection_id() |
+-----------------+
| 56 |
+-----------------+
1 row in set (0.00 sec)
以只读方式锁定所有数据库:
flush tables with read lock;
set GLOBAL read_only=on;
解除锁定
set GLOBAL read_only=off;
UNLOCK tables;
充分利用mysql的自动恢复能力
mysql服务器的崩溃恢复能力是数据库完整维护工作的第一条防线,事务型存储引擎的自动恢复在mysql服务器启动时会自动发生,myisam自动恢复是可选的,需要明确启用(配置文件配置:myisam_recover_options=force,backup)。
定期进行预防性维护
制作数据库备份
防止数据库丢失,损坏;把一个数据库复制到另一个mysql服务器;建立复制服务器(主从)
数据库备份按照格式可以分为两类:
1.文本格式备份。这种备份通过使用mysqldump程序将数据表内容写到转储文件(dump file)而得到的,内容由create table和insert两种语句构成,把转储文件重新加载到mysql服务器就可以恢复有关数据表。
2.二进制文件备份。直接复制包含数据表内容的文件而得到的。制作这类备份有多重方法,如mysqlhotcopy,cp,tar等都可以进行数据库的二进制备份。
每种备份都有各自的优缺点:
mysqldump必须和mysql服务器配合使用,备份时,mysql服务器必须是运行状态。
二进制备份是在mysql服务器外部进行的文件操作,这些方法有些需要关停mysql服务器;对于不关停mysql服务器的二进制备份方法,必须保证在你复制mysql数据表文件时不会修改数据表。
mysqldump比二进制备份速度要慢,因为转储操作需要通过网络在mysqldump程序和mysql服务器之间传输信息。二进制备份是直接在文件系统级进行文件复制。
mysqldump生成的的sql的文本文件,容易移植到其他机器上。
mysqldump输出的只包括数据库信息如表,视图,存储例程等,不包括没被保存的数据库信息,如配置文件,日志文件等;二进制备份选择余地就到了,可以在备份时复制任何一个文件。
备份原则
定期备份;备份文件名规则;备份文件不和数据库放在同一个文件系统;定期清除备份文件,防止占用更多空间;
用mysqldump程序制作文本备份
1.备份所有数据库
[root@host test]# mysqldump -hlocalhost -u root -proot --all-databases >/root/dbbak/alldatabases_20180302.sql
2.备份指定若干数据库(下例备份2个数据库)
[root@host test]# mysqldump -hlocalhost -u root -proot --databases test metastore >/root/dbbak/test_mata_20180302.sql
3.备份一个数据库
[root@host test]# mysqldump -hlocalhost -u root -proot test>/root/dbbak/test_20180302.sql
4.备份表(备份test库的表role,表log1)
[root@host test]# mysqldump -hlocalhost -u root -proot test role log1>/root/dbbak/role_log1_20180302.sql
压缩备份
[root@host test]# mysqldump -hlocalhost -u root -proot test role log1|gzip>/root/dbbak/role_log1_20180302.zip
文件如下:压缩后明显小了很多
-rw-r--r-- 1 root root 2900 Mar 2 10:29 role_log1_20180302.sql
-rw-r--r-- 1 root root 949 Mar 2 10:33 role_log1_20180302.zip
导入全备数据
[root@host ~]# mysql -u root -proot test </root/tmpdata/game3004.sql
mysql> source /root/tmpdata/game3004.sql;
mysqldump程序有许多选项
mysqldump给出一个库名,后面跟一个或者多个表名
mysqldump 后面使用--databases,后面跟多个库名可以一次转储多个数据库的数据表
mysqldump 后面使用--databases或者--all-databases,后面不给出任何数据库名或其他参数,则转储MYSQL服务器下的数据库
--opt可以对转储进行优化
二进制备份
直接复制数据库文件,典型做法是使用文件系统工具(cp,tar或者rsync),或者使用专门的工具(mysqlhotcopy或者InnoDB hot backup)
直接复制法备份需要1.最好的办法就是关停mysql服务器 2.一定要把恢复表所需要的所有文件全部复制下来
制作一个完整的二进制备份