对InnoDb执行mysqldump时应该加上 –single-transaction参数

mysqldump默认情况下并不保证数据一致性。 在innodb中,可以这样: mysqldump –single-transaction mydb > mydb-backup.sql 如果有 –single-transaction参数,mysqldump会将整个数据的读取过程置于一个满足repeatable read的事务中,最后导出的数据也是相互一致的。 由于innodb的mvcc特性,使用 –single-transaction执行mysqldump, 不会阻塞其他进程的读写。

MySQL两种备份模式:Logical Backup 和 Raw Backup

Logical Backup 就是用诸如mysqldump这样的工具把数据导出为可视的sql文件或csv文件。 Raw Backup 则是指直接备份数据库的数据文件。 Raw Backup执行起来比Logical Backup快的多,因为它不需要消耗CPU/内存把数据变成sql或csv(顺便说一下,变csv比变sql要快很多)。 但Raw Backup有一个缺点:Raw File的跨平台能力比较弱。 一个windows下的文件在linux下可能就用不了,一个从mysql 5.1导出的文件可能无法被mysql 5.5识别。 Raw Backup还有一个严重的缺点: 如果Raw File是一个Corrupted File, 复制后产生的备份仍是一个Corrupted File; 这个备份就没有作用,因为你没法利用它来恢复数据。

备份MySQL数据时最好从备库中备份

数据备份对数据库本身有cpu压力;如果为了追求一致性,可能还要施加锁表操作,影响一定的可用性。数据量越大,这些代价就越高。 可以专门设置一个备库,然后从这个备库中把数据和binlog备份出来。

innodb的binlog跟redo/undo log无关

mysql, 不管用的是不是innodb, 都有binlog. 这个binary log跟transaction没关系,它主要用于replication和backup. log文件会一直递增,不会循环使用(后面的记录不会覆盖前面的) 同时,innodb还有redo log/undo log. 它们用于transaction, 且会循环使用。

innodb中应该尽量把多条语句放在单个事务中执行

默认情况下,一个写操作就是一次事务。 如果一次业务操作包含三次DB写操作,三个写操作就是三个事务,三个事务导致三次log flush(磁盘读写,代价较高): 引用 InnoDB must flush the log to disk at each transaction commit if that transaction made modifications to the database. 所以应该把这三次DB写操作合在一个事务里,这样只需要做一次flush disk。

MySQL Replication的基本架构

摘自High Performance MySQL 复制过程的核心是binlog 拓扑方面: 1. 一主一备最常见,可满足典型的读写分离需求 2. 一主多备也可以,但要注意备机太多可能导致主机负担过大。有个办法是主机只挂一个特殊的备机,其他备机再从这个特殊备机中同步数据(即把特殊备机当作主机),把主机的同步负担转移到特殊备机上。这个策略叫distribution master 3. 你可能会想用主主双活(Master-Master in Active-Active Mode)来同时分担读负担和写负担,即两台机分别是对方的备机,每台机都可以读和写,并互相数据同步。但这样做在数据一致性方面的问题非常多,严重不推荐。比如说,数据同步失效了,但两台机仍在提供写服务,怎么办?数据肯定不一致了。 4. 比较受推荐的模式是主主轮活(Master-Master in Active-Passive Mode),即在某一时刻总是一主一备,但必要时可以立即互换主备角色。这种模式在可用性方面(即无当机时间)很有帮助。比如,alter table可能会比较久,造成数据库不可用;但在主主轮活模式下,可以先去备机alter table, 然后切换一下角色,让原备机变成新主机提供服务,让原主机以新备机的角色同步alter table行为。这个过程中不会有down time.

点击文本然后修改,建议用X-editable

http://vitalets.github.io/x-editable/ 可以跟bootstrap或者跟jquery整合,蛮好用的。 如果跟dataTables结合起来用,相当于是extJs了,很不错。 下面是一个结合使用的例子: <script src="/assets/js/bootstrap-editable.min.js"></script> <link href="/assets/css/bootstrap-editable.css" rel="stylesheet"> …. <script> //某列的写法 { "data": "firstName", "name": "firstName", "render": function ( data, type, full, meta ) { var template = ‘<a href="#" class="firstNameEditable editable editable-click" data-type="text" data-pk="{1}" data-name="firstName" data-url="/updateManAjax" data-title="New First Name">{0}</a>’; var html = template.format(full.firstName, full.manId); //作者在这里使用了模板引擎,你自己直接拼字符串也可以 return html ; }, … }, … //在dataTable的回调中注册editable组件。你必须写在dataTable的相关回调里面,只有等dataTable渲染完后,前面定义的editable …

点击文本然后修改,建议用X-editable Read More »

mysql: my.cnf在哪里?

先找到mysqld的执行文件 引用 #ps aux|grep mysqld 如:  /usr/libexec/mysqld 运行一下这个程序的help命令,根据输出中的"Default options"关键字找到my.cnf的位置 引用 #sudo /usr/libexec/mysqld –verbose –help |grep -A1 "Default options" 如: 引用 Default options are read from the following files in the given order: /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

注意Prepared Statement执行时会比普通statement多一次连接

使用Prepared Statement时,你要先输入那种带问号的语句,让数据库服务端生成一个Prepared Statement句柄传给你;你再拿着这个句柄,输入参数让数据库去执行n次sql。 也就是说,这里客户端与服务端的交互(round trip)发生了1 + n次。1 = 生成prep stmt, n = 执行sql. 典型的OLTP应用在大部分情况下,都不会循环执行sql,也就是说 n=1.也就是说,如果不使用prep stmt, 一次数据库交互需要1个round trip; 如果用了,那就是 n +1 = 1 + 1 =2. 使用prep stmt时发生的round trip数增加了1倍! 这对性能还是有一定影响的。不过,出于安全原因,没人不敢不用prep stmt. 所以,讨论性能问题似乎也没有多大意义。