MySQL中的datetime与timestamp比较

相同

显示

TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。

不同

范围

datetime 以’YYYY-MM-DD HH:MM:SS’格式检索和显示DATETIME值。支持的范围为’1000-01-01 00:00:00’到’9999-12-31 23:59:59′TIMESTAMP值不能早于1970或晚于2037

储存

TIMESTAMP

1.4个字节储存(Time stamp value is stored in 4 bytes)

2.值以UTC格式保存( it stores the number of milliseconds)

3.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。

datetime

1.8个字节储存(8 bytes storage)

2.实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)

3.与时区无关(It has nothing to deal with the TIMEZONE and Conversion.)

实例对比

现在我来做个时区对他们的影响。

1.先插入一个数据insert into `t8` values(now(), now());

2.改变客户端时区(东9区,日本时区)。

3.再次显示插入的数据,变化了,timestamp类型的数据 增加了 1个小时

接下来 讨论一些timestamp 的其他的属性

1.null 是否为空

timestamp 默认允许为 “非空”(not null by default), 如果你在定义“ts TIMESTAMP DEFAULT NULL” 是非法的。 可以指定为空 null ,“ts TIMESTAMP NULL” ,这时可以在添加语句改变默认值。

ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

default (一个表中只能有一个列选择下面其中一种)

default CURRENT_TIMESTAMP

default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

ON UPDATE CURRENT_TIMESTAMP

ON UPDATE 见上2

mysql5.5双机热备配置

首先,假设两个机器已经装好mysql数据库已经装好, ip分别为 A ip:1.1.1.1 B:2.2.2.2

第一步:操作之前需要先把两个库停止操作(增删改),然后把要同步的库里边的数据手工同步一下(直接拷文件或者 mysqldump 自己咋方便咋来),这个过程是必须的,不然你后面怎么弄的都配置不好。还有个问题下面的方法是适用于 mysql5.5的。mysql5.1.5之前的是在 my.cnf 里边配置 master-host的,之后就不支持了,配置之前先看一下自己的mysql 版本 (mysql –version)。

第二步:在两台mysql上创建用户,设置权限
A上添加:
grant replication slave,replication client,reload,super on *.* to ‘sync_user’@’2.2.2.2’ identified by ‘123456’ with grant option;      //用于B访问
B上:
grant replication slave,replication client,reload,super on *.* to ‘sync_user’@’1.1.1.1’ identified by ‘123456’ with grant option;            //用于A访问
执行 flush privileges; 更新数据库使用户生效。(注意:账号加上以后务必从两个机器上互相链接测试一些,确保能链接成功,可能被防火墙之类的的拦截,如果被拦截了的话,自己到网上找教程吧)

第三步:2.在my.cnf里边添加进行相关配置:
A:
server-id = 1
replicate-do-db =mydb    #需要同步的库,多个的话,添加多行
replicate-ignore-db=mysql    #不用同步的库
log-bin=mysql-bin
expire_logs_day=1
max_binlog_size = 500M
slave-skip-errors=all
skip-name-resolve
max_connect_errors=999
slave_net_timeout=60
wait_timeout=30
innodb_file_per_table=on
back_log=200

B:
server-id  = 2
replicate-do-db =mydb    //需要同步的库,多个的话,添加多行
replicate-ignore-db=mysql    #不用同步的库
log-bin=mysql-bin
expire_logs_day=1
max_binlog_size = 500M
slave-skip-errors=all
skip-name-resolve
max_connect_errors=999
slave_net_timeout=60
wait_timeout=30
innodb_file_per_table=on
back_log=200保存后,重启mysql

第四步:在A机器上mysql shell中执行show master status:

mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000017 |      795 |              |                  |
+——————+———-+————–+——————+

记录下这File 和 Position 这两个值,然在B机器上执行  stop slave;然后执行:

CHANGE MASTER TO  MASTER_HOST=’1.1.1.1′, MASTER_PORT=3306, MASTER_USER=’sync_user’, MASTER_PASSWORD=’123456′, MASTER_LOG_FILE=’mysql-bin.000017‘, MASTER_LOG_POS=795;

注意:蓝色部分需要刚才记录的那两个值,然后用户名密码改成你自己设置的内容。

start slave;//开始同步

执行show slave status\G; 如果显示以下信息,表示同步设置成功.
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果不是这样,在mysqldata目录下找 error log 看是什么原因,不明白那log里边的内容区网上搜。

如果以上内容显示正确则表示 主从同步设置成功 成功,如果要设置主主同步还需继续,下面的过程和第四步差不多。

第五步:上一步没有问题。则在B上继续执行show master status;
#show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000005 |    6854 |              |                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)

在A上执行:stop slave;//停止同步
CHANGE MASTER TO  MASTER_HOST=’2.2.2.2′, MASTER_PORT=3306, MASTER_USER=’sync_user’, MASTER_PASSWORD=’123456′, MASTER_LOG_FILE=’mysql-bin.000005′, MASTER_LOG_POS=6854;
#start slave;//开始同步注意事项同上

执行show slave status\G;如显示如下内容,表示同步设置成功。
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

ok 主主同步设置成功,以上步骤必须顺序执行,同事里边提到的注意事项也需要特别注意,这些都是本人的亲身经历。