MySQL 一些基本操作 ALTER TABLE:添加,修改,删除表的列,约束等表的定义。
查看列:desc 表名;
修改表名:alter table t_book rename to bbb;
添加列:alter table 表名 add column 列名 varchar(30);
删除列:alter table 表名 drop column 列名;
修改列名MySQL: alter table bbb change nnnnn hh int;
修改列名SQLServer:exec sp_rename't_student.name','nn','column';
修改列名Oracle:lter table bbb rename column nnnnn to hh int;
修改列属性:alter table t_book modify name varchar(22);
sp_rename:SQLServer 内置的存储过程,用与修改表的定义。
mysql修改、删除数据记录:
mysql数据库相信很多人都接触过,在进行mysql数据库的操作的时候,有人就希望删除或者修改mysql数据库中的一些数据记录。DELETE 和UPDATE 语句令我们能做到这一点。
用update修改记录:
UPDATE tbl_name SET 要更改的列
WHERE 要更新的记录:
这里的 WHERE 子句是可选的,因此如果不指定的话,表中的每个记录都被更新。
例如,在pet表中,我们发现宠物Whistler的性别没有指定,因此我们可以这样修改这个记录:
mysql> update pet set sex=’f’ where name=” Whistler”;
用delete删除记录:
DELETE 语句有如下格式:
DELETE FROM tbl_name WHERE 要删除的记录
WHERE 子句指定哪些记录应该删除。它是可选的,但是如果不选的话,将会删除所有的记录。这意味 着最简单的 DELETE 语句也是最危险的。
这个查询将清除表中的所有内容。一定要当心!
为了删除特定的记录,可用 WHERE 子句来选择所要删除的记录。这类似于 SELECT 语句中的 WHERE 子句。
mysql> delete from pet where name=”Whistler”;
可以用下面的语句清空整个表:
mysql>delete from pet;
总结
本节介绍了两个SQL语句的用法。使用UPDATE和DELETE语句要十分小心,因为可能对你的数据造成危险。尤其是DELETE语句,很容易会删除大量数据。使用时,一定小心。
MySQL InnoDB 管理和备份二进制日志
(一)二进制日志的重要性
如果有某个时间点的数据备份和所有从那时以后的二进制日志就可以重放自从上次全备以来的二进制日志并“前滚”所有的变更
(二)二进制日志配置的最佳实践
对于 InnoDB 如果仅是启用二进制日志是不够、还需要其他措施来保证安全:
推荐配置如下:
● sync_binlog = 1
表示采用同步写磁盘的方式来写二进制日志、这时写操作便绕开了OS的缓冲
该默认值为0
● innodb_support_xa = 1
确保二进制日志和InnoDB 数据文件的同步
(三)影响二进制日志备份策略的因素
如下图:
(四)二进制日志的格式
二进制日志的粒度是事件、每个事件都有固定的事件头、含:When、What、Who等
因其格式为二进制不可看、我们可借助 mysqlbinlog 查看其内容
下面是一个例子:
[mysql@even data]$ mysqlbinlog -vv mysql-bin.000023 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #130515 12:35:29 server id 2 end_log_pos 107 Start: binlog v 4, server v 5.5.16-log created 130515 12:35:29 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' kRCTUQ8CAAAAZwAAAGsAAAABAAQANS41LjE2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAACREJNREzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 107 #130515 12:37:47 server id 2 end_log_pos 255 Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1368592667/*!*/; SET @@session.pseudo_thread_id=3/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=2/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; alter database db_rocky character set = utf8mb4 COLLATE = utf8mb4_unicode_ci /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; |
这里列了 2 个事件、来看第二个事件:
# at 107 #130515 12:37:47 server id 2 end_log_pos 255 Query thread_id=3 exec_time=0 error_code=0 |
第一行表示该事件的起始位置:at 107
第二行包含如下几项:
● 事件的日期和时间:130515 12:37:47
● 服务器 ID、这对于防止复制之间无限循环和其他问题是非常有必要的
● 下一个事件的开始位置:end_log_pos 255
注意了:该值通常是不正确的。因为主库会复制事件到一个缓冲区、但这样做时MySQL并不知道下个日志事件的位置
● 事件类型、这里是 Query
● 执行改事件的线程 ID、这点对审计蛮重要的
● 语句的时间戳和写入二进制日志的时间差:exec_time
该值在复制落后的备库上会有很大偏差
● 事件产生的错误代码
(五)清除老的二进制日志的方法
不要用 rm 删除日志、否则、将会导致 mysql-bin.index 状态文件与磁盘上的不一致
应该用类似下面的 cron 命令:
0 0 * * * /usr/bin/myql -e "PURGE MASTER LOGS BEFORE CURRENT_DATE - INTERVAL N DAY"