Submitted by yejr on 周一, 2008/11/10 - 16:23
想要在MySQL 5.1以下的版本中动态抓取提交到MySQL中的查询日志,可以采用tcpdump的方法,大致如下:
tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'
eth0指mysqld监听的网卡,330自然是指mysqld监听的端口,正则匹配模式里,可以自己添加想要抓取的SQL语句类型。
Submitted by yejr on 周五, 2008/10/24 - 14:35
0、前言
本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump 的一些差异,为备份方式的选择提供更多的帮助。
1、mysqldump
首先来看下 mysqldump 的几个主要参数的实际工作方式。
mysqldump 几个主要选项
1. -q
很简单,什么都不做,只是导出时加了一个 SQL_NO_CACHE 来确保不会读取缓存里的数据。
Submitted by yejr on 周五, 2008/08/29 - 14:29
明明是64位系统下,有16G内存,启动mysqld时指定 innodb_buffer_pool_size 为12G,却报一下错误:
080829 14:15:14 mysqld started
InnoDB: HugeTLB: Warning: Failed to allocate 12884918272 bytes. errno 22
InnoDB HugeTLB: Warning: Using conventional memory pool
080829 14:15:14 InnoDB: Error: cannot allocate 12884918272 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 44607312 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds...
InnoDB: Fatal error: cannot allocate the memory for the buffer pool
Warning: Failed to allocate 29360128 bytes from HugeTLB memory. errno 12
Warning: Using conventional memory pool
080829 14:16:14 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.0.45-log' socket: '/home/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL)
Submitted by yejr on 周一, 2008/07/14 - 14:23
假设有个myisam表:tbl,为了备份方便,直接把 frm 和 MYD 文件拷贝到其他目录。在还原时,就需要重新下创建索引,只需要执行以下命令:
mysql> REPAIR TABLE `tbl` USE_FRM;
即可根据 frm 和 MYD 文件,产生一个新的 MYI 索引文件。这在索引文件较大时备份还原比较有用。
另外,mysql 5.1起开始支持 分区(partition),但是如果表的某个子分区索引坏了,用 REPAIR TABLE 却无法修复,咋办呢?
其实很简单,利用 myisamchk 工具就可以修复了,例如:
path/myisamchk -rq tbl#P#P2
- check record delete-chain
Submitted by yejr on 周一, 2008/06/16 - 21:55
不能,只能用 bind-address 参数设定要绑定的某个ip,或者不设置它,直接帮定到所有ip上;或者,可以用 skip-networking 选项,直接取消网络监听,只保留本机的socket连接。
Submitted by yejr on 周三, 2008/06/04 - 23:19
其实MySQL一直都是单进程、多线程的工作模式。只是,LinuxThreads并不是真正的线程,因此,这些进程其实还是采用系统调用 clone() 来共享同样的地址空间的。尽管采用 ps 查看的结果看起来是多进程,其实mysqld真正的工作方式还是多线程。
Submitted by yejr on 周六, 2008/05/31 - 14:41
故障现象:
1:使用mysqldump命令dump出整个数据库:
mysqldump: Got error: 1105: File './db/data_20070901.MYD' not found (Errcode: 24) when using LOCK TABLES
2:查看/data/db下面文件没有缺少,使用mysql客户端连接desc以及select * from这个表都没有问题。而且如果使用dump命令直接dump这个表也不会出错
通过 perror 24 得知,错误信息为:
[root@localhost ~]#perror 24
OS error code 24: Too many open files
因此,修改一下 /etc/my.cnf ,设定open_files_limit 为较大值,如 4096,重启mysqld生效。
Submitted by yejr on 周六, 2008/05/31 - 14:34
innodb表不像myisam,有个内置的计数器。
1. 可以用
select count(*) from table_name where primary_key >=0
2. 或
select count(*) from table_name where key_col >=0
3. 类似这样的来查询,通过
show table status
得到的结果不够准确,会随时变化,只是个大致的值
如果该表的列数较多,那么建议用第二种方法。
Submitted by yejr on 周日, 2008/05/25 - 19:19
问:数据库是MyISAM的,从备份库中从把a.frm,a.MYD,a.MYI覆盖掉同名文件,但不行,咋回事涅?
答:需要再执行一次 flush tables; 才会生效,因为该数据表的文件句柄已经打开了,所以需要刷新一下。
Submitted by yejr on 周日, 2008/05/25 - 19:06
错误信息大概像下面这样:
Error: Table 'xxx' is marked as crashed and should be repaired
意思是数据表损坏了,无法读取,只需要执行以下命令修复表即可:
mysql> REPAIR TABLE `xxx`;
如果经常性的出现这种问题,那么建议加大 key_buffer_size 以及 query_cache_size。
如果还是不行,那么考虑把表转成innodb,或者检查你的磁盘是否有硬件问题吧。
页面
最近评论