• mysql主从同步过程 同步原理

    Replication 线程
       Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的告终全副复制过程重要由三个线程来告终,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
      要告终 MySQL 的 Replication ,率先定然敞开 Master 端的Binary Log(mysql-bin.******)功能,否则无法告终。因为全副复制过程切实上即便Slave从Master端获得该日志然后再在自己身上全面 次序的厉行日志中所登记的各种垄断。敞开 MySQL 的 Binary Log 能够穿越在启用 MySQL Server 的过程中利用 “—log-bin” 参数选项,可能在 my.cnf 搭配文件中的 mysqld 参数组([mysqld]标识后的参数局部)添置 “log-bin” 参数项。
      MySQL 复制的大约过程如下:
      1. Slave 上面的IO线程连接上 Master,并哀求从指定日志文件的指定位置(可能从最开始的日志)尔后的日志内容;
       2. Master 接收到来自 Slave 的 IO 线程的哀求后,穿越负责复制的 IO 线程依据哀求消息读取指定日志指定位置尔后的日志消息,归来给 Slave 端的 IO 线程。归来消息中除非日志所包括的消息之外,还包括鄙碌回的消息在 Master 端的 Binary Log 文件的名目以及在 Binary Log 中的位置;
      3. Slave 的 IO 线程接收到消息后,将接收到的日志内容顺次写入到 Slave 端的Relay Log文件(mysql-relay-bin.******)的最末路,并将读取到的Master端的bin-log的文件名和位置登记到master- info文件中,以便在下顺次读取的时候能够打听的高速Master“我必需从某个bin-log的哪个位置开始后来的日志内容,请发给我”
       4. Slave 的 SQL 线程检测到 Relay Log 中新添置了内容后,会即刻解析该 Log 文件中的内容成为在 Master 端诚厉行行时候的那些可厉行的 Query 语句,并在切身厉行这些 Query。这么,切实上即便在 Master 端和 Slave 端厉行了同样的 Query,因而两端的数据是全面一样的。
      切实上,在老版本中,MySQL 的复制告终在 Slave 端并不是由 SQL 线程和 IO 线程这两个线程共同配合而告终的,而是由独自的一个线程来告终所有的工作。然而 MySQL 的工程师们很快觉察,这么做存在很大的危险和功能问题,重要如下:
       率先,万一穿越一个单一的线程来自力更生告终这个工作的话,就使复制 Master 端的,Binary Log日志,以及解析这些日志,然后再在切身厉行的这个过程成为一个串行的过程,功能慷慨会受到较大的局限,这种架构下的 Replication 的迟到慷慨就比拟长了。
       其次,Slave 端的这个复制线程从 Master 端获得 Binary Log 到来尔后,必需随后解析这些内容,还原成 Master 端所厉行的原始 Query,然后在切身厉行。在这个过程中,Master端很可能又曾经发生了许多的改变并生成了许多的 Binary Log 消息。万一在这个阶段 Master 端的存储系统揭示了无法修复的故障,那么在这个阶段所发生的所有改变都将永远的失落,无法再找归来。这种埋伏危险在Slave 端压力比拟大的时候尤其冒尖,因为万一 Slave 压力比拟大,解析日志以及利用这些日志所花费的工夫慷慨就会更长一些,可能失落的数据也就会更多。
       因而,在后期的改革中,新版本的 MySQL 为了尽量减小这个危险,并长进复制的功能,将 Slave 端的复制改为两个线程来告终,也即便前面所提到的 SQL 线程和 IO 线程。最早提出这个改进计划的是Yahoo!的一位工程师“Jeremy Zawodny”。穿越这么的改革,这么既在很大程度上处理了功能问题,缩小了异步的延随工夫,同时也收缩了埋伏的数据失落量。
      当然,即便是换成了目前这么两个线程来配合处理尔后,同样也还是存在 Slave 数据延时以及数据失落的可能性的,终究这个复制是异步的。凡是数据的改动不是在一个事务中,这些问题都是存在的。
      万一要全面避免这些问题,就只能用 MySQL 的 Cluster 来处理了。不过 MySQL的 Cluster 懂得笔者写这局部内容的时候,依旧还是一个内存数 据库的处理计划,也即便必需将所有数据包括索引全副都 Load 到内存中,这么就对内存的要求就极其大的大,对于等闲的公众化利用来说可厉行性并不是太大。当然,在之前与 MySQL 的 CTO David 沟通的时候得知,MySQL 目前正在不时改进其 Cluster 的告终,其中极其大的一个修改即便批准数据无须全副 Load 到内存中,而仅仅只是索引全副 Load 到内存中,我想信在告终该项改革尔后的 MySQL Cluster 将会更加受人迎接,可厉行性也会更大

  • insert into … select …

    语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1
    要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。

  • mysql 日期格式与时间戳的相互转换

    2008-08-08  ->1178845140

    update 表名 set l字段名=UNIX_TIMESTAMP(字段名)

    1178845140 ->2008-08-08

    update 表名 set l字段名=FROM_UNIXTIME(字段名)

  • MYSQL常用命令

    1.查看MYSQL 数据库编码
    SHOW VARIABLES LIKE ‘character_set_%’;
    mysql> show variables like ‘character_set_%’;
    其中,set_connection是连接编码,latin1是瑞典编码。
    2.导入.TXT文件与导出*.TXT
    load data infile ‘TXT文件的完整路径’ into table 表名;
    linux:TXT文件的完整路径=‘/tmp/aaa.txt’
    windowns:TXT文件的完整路径=’e:\\aaa.txt’
    .txt的文件用Tab隔离
    表中有auto_increment属性的字段,在.txt文件中使用null
    select   *   from  table_name  into  outfile  ‘ path/filename.txt ‘ ;
    3.新增用户
    一:登录进入MySQL数据库后:
    (1).use mysql;
    (2).INSERT INTO `user` VALUES (‘localhost’, ‘newuser’, PASSWORD( ‘newpassword’ ) , ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ”, ”, ”, ”, ‘0’, ‘0’, ‘0’, ‘0’);
    (3).FLUSH PRIVILEGES ;
    提示:PASSWORD函数的运用需要注意版本,参考函数的调用:OLD_PASSWORD
    注意:第三点是插入数据成功后,让他生效的。
    二:用 grant 分配
    grant   all   on   * . *   to  admin @localhost  identified  by   ‘ admin ‘ ;
    说明:  admin 用户(密码为admin)分配所有权限(除grant),对所有数据库和所有表.
    grant   all   on   db_name . *   to  chenlb@ %  identified  by   ‘ chenlbpassword ‘ ;
    说明: chenlb用户有所有权限,只对 db_name的所有表.
    grant   select , insert   on   db_name .tb_name  to  clb @chenlb .com identified  by   ” ;
    说明: clb 用户(密码为空,只有 chenlb.com 主机才有效,
    如果改为%.chenlb.com就对所有后缀为chenlb.com的主机都有效)
    只对 db_name 中的 tb_name 表中有 select,insert 权限.
    权限可以加上(delete,update,drop,create ……)。
    4.重命名表
    ALTER   TABLE  `table_name` RENAME `new_table_neme` ;
    5.改用户密码
    use  mysql;
    update   user   set  password = password(“new_pass”)  where   user = “root”;
    flush  privileges ;
    mysqladmin  – u username  – p pw password newpassword
    6.设远程用户
    use  mysql;
    update   user   set  Host = ‘ % ‘   where   user = ‘ user_name ‘ ;
    flush  privileges ;
    或为特定的IP
    注意:否则,登录时出错–Access denied for user ‘clb’@’localhost’ (using password: YES)
    7.mysql导出\入.sql文件
    导出:
    mysqldump  – u  user_name   – p  [ your_password ]  db_nmae  >  path\ file_name .sql
    如果[your_password]缺省,然后提示输入密码:有密码则输入,否则直接回车
    导入:
    mysql  – u  user   – p  [ your_password ]   db_name   <  path\filename.sql
    同上。
    在linux上导出
    如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
    iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名
    8.设置密码的几种方法
    //不行1.mysqladmin -u user_name password new_password
    9.符合条件的从那里开始,在多少以内.
    select   *   from  talbe_name limit  0 , 30 ;
    说明:从符合条件的第1条开始,读出30条,如果不够30条,取最大.
    10.添加字段
    ALTER   TABLE  `table_name`  ADD  `colum_name`  VARCHAR (  11  )  NOT   NULL  AFTER `colum_name` ;
    11.函数
    select coalesce(null,3,null)
    返回列表的第一个非NULL值
    select greatest(3,5)
    返回列表的最大值
    select least(2,0)
    返回列表的最小值
    12.加入单引号
    INSERT INTO `userinfo` (`id`, `username`, `lastlogin`)
    VALUES (NULL, ”’陈”’, ‘2006-07-28’);
    说明用两个单引号.
    13.输出警告
    warnings
    14.安装/删除服务
    mysqld  — install MySQL –defaults-file=C:\my-opts.cnf
    mysqld –remove
    15.改变自增值
    ALTER TABLE `table_name` AUTO_INCREMENT =1
    16.设主键
    ALTER TABLE `table_name` ADD PRIMARY KEY (`id`)
    17.搜索
    SELECT * FROM `email_list` WHERE relation LIKE ‘%老%’
    18.表结构
    DESCRIBE db_name;
    19.添加索引(即:唯一)
    ALTER TABLE `user` ADD UNIQUE (`username`)
    20.删除
    delete from text order by id desc limit 2;
    21.建表
    CREATE TABLE `tt` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 50 ) NOT NULL
    ) ENGINE = MYISAM ;
    22.帐户
    drop   user  svn @localhost ;

    GRANT ALL PRIVILEGES ON *.* TO admin@”8.8.8.8″ IDENTIFIED BY ‘111111’ WITH GRANT OPTION;

  • MySQL主从同步配置

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。(这与同步复制可以进行对比,同步复 制是MySQL簇的一个特征)。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个 从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通 知新的更新。
    单向复制有利于健壮性、速度和系统管理:
    ·          主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器。
    ·          通过在主服务器和从服务器之间切分处理客户查询的负载,可以得到 更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器 保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
    ·          使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
    MYSQL复制需要理解注意的地方:
    MySQL复制基于主服务器在二进制日志中记录所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
    二进制日志只是一个从启用二进制日志的固定时间点开始的数据库操作记录。所以设置任何从服务器时,首先要把从服务器的数据库与主服务器开启二进制时的数据库同步。如果启动从服务器时,其数据库与主服务器数据库启动二进制日志时的状态不相同,从服务器很可能失败。
    MYSQL复制设置步骤:
    1.同步主从数据库
    登录数据库管理命令行,执行FLUSH TABLES WITH READ LOCK语句清空所有表和块的写入语句。
    mysql> FLUSH TABLES WITH READ LOCK;
    进入MYSQL的数据库存放路径,使用tar对要设备主从复制的数据库进行压缩归档:
    shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
    确认MYSQL当前是否开启了二进制日志,如果当前已经开启了二进制日志请执行:SHOW MASTER     STATUS;命令,记录当前二进志日志文件名和日志的偏移量,这在设置从服务器时用来确定要读取    二进制日志的位置。
    mysql > SHOW MASTER STATUS;
    +—————+———-+————–+——————+
    | File         | Position | Binlog_Do_DB        | Binlog_Ignore_DB |
    +—————+———-+————–+——————+
    | mysql-bin.003 | 73            | test                    | manual,mysql |
    +—————+———-+————–+——————+
    如果当前没有开启二进制日志请设置MYSQL配置文件,开启MYSQL的二进制功能,然后重新启动 MYSQL,登录到MYSQL命令行,重新启用MYSQL写操作。
    mysql> UNLOCK TABLES;
    接下来把刚才压缩备份的数据库复制到从服务器的数据库存放目录,解压,更改这些文件的权限, 确保对这些文件和目录的权限正确,MySQL的运行用户必须能够读写这些文件。
    2.设置MYSQL配置文件
    确保主服务器的mysql配置文件my.cnf文件的[mysqld]部分包括一个log-bin选项,如果需要只   对某一个数据库进行复制,在log-bin下加入binlog-do-db=XXX和一个server-id=Master_id选项,其中server-id的值必须为1到232–1之间的一个正整数值。
    [mysqld]
    log-bin=mysql-bin
    server-id=1
    登录到MYSQL命令行,为从服务器创建一个同步帐户:
    mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’slave_ip’ IDENTIFIED BY ‘pass’;
    编辑从服务器的MYSQL配置文件,确保从服务器的server-id与主服务器的server-id不冲突。
    [mysqld]
    server-id=2
    3.开始主从同步
    在从服务器上执行下面的语句,用你的系统的实际值替换选项值:
    mysql> CHANGE MASTER TO
    ->MASTER_HOST=’master_host_name’,
    ->MASTER_USER=’replication_user_name’,
    ->MASTER_PASSWORD=’replication_password’,
    ->MASTER_LOG_FILE=’recorded_log_file_name’,
    -> MASTER_LOG_POS=recorded_log_position;
    master_host_name:主服务器的计算机名或IP地址
    replication_user_name:主服务器为从服务器设置的复制帐号
    replication_password:复制帐号密码
    recofded_log_file_name:主从服务器数据库同步时所记录的二进制文件名
    recorded_log_position:主从服务器数据库同步时所记录的二进制偏移量,也就是要读取数据库          日志的位置。
    启动从服务器线程:mysql> START SLAVE;
    执行这些程序后,从服务器应连接主服务器,并执行自从数据库同步以来发生的任何更新。
    从服务器复制时,会在其数据目录中生成dmaster.info和relay-log.info两个 文件。从服务器使用这两个文件记录已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你清楚你正在做什么并完全理解其含义。即使这样,最 好是使用CHANGE MASTER To语句来修改。

    CHANGE MASTER TOmaster_def[,master_def] …

     
    master_def:
           MASTER_HOST = 'host_name'
         | MASTER_USER = 'user_name'
         | MASTER_PASSWORD = 'password'
         | MASTER_PORT =port_num
         | MASTER_CONNECT_RETRY =count
         | MASTER_LOG_FILE = 'master_log_name'
         | MASTER_LOG_POS =master_log_pos
         | RELAY_LOG_FILE = 'relay_log_name'
         | RELAY_LOG_POS =relay_log_pos
         | MASTER_SSL = {0|1}
         | MASTER_SSL_CA = 'ca_file_name'
         | MASTER_SSL_CAPATH = 'ca_directory_name'
         | MASTER_SSL_CERT = 'cert_file_name'
         | MASTER_SSL_KEY = 'key_file_name'
         | MASTER_SSL_CIPHER = 'cipher_list'

    可以更改从属服务器用于与主服务器进行连接和通讯的参数。

    MASTER_USER,MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器连接的信息。

    即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用一个SSL支持已启用的服务器。

    如果您不指定一个给定的参数,则它会保持其原有的值。例外情况在后面的讨论中进行了说明。举例说明,如果用于连接到您的MySQL主服务器的 密码被更改了,您只需发布这些语句,就可以告知从属服务器新的密码:

    mysql>STOP SLAVE; -- if replication was running
    mysql>CHANGE MASTER TO MASTER_PASSWORD='new3cret';
    mysql>START SLAVE; -- if you want to restart replication

    没有必要指定没有改变的参数(主机、接口、用户等)。

    MASTER_HOSTMASTER_PORT是主服务器主机和其TCP/IP接口的主机名(或IP地址)。注意,如果MASTER_HOSTlocalhost相等,那么,和MySQL的其它部分一样,接口可以被忽略(例如,如果可以使用Unix插槽文件)。

    如果您指定了MASTER_HOSTMASTER_PORT,则从属服务器会假定主服务器与以前不一样(即使您指定的主机或接口值与当前值是一样的。)在此情况下,主服务器二进制日志的名称和位置的原有值不再适用,因此,如果您不指定语句中的MASTER_LOG_FILEMASTER_LOG_POSMASTER_LOG_FILE=”MASTER_LOG_POS=4会被静默地添加。

    MASTER_LOG_FILEMASTER_LOG_POS坐标点,从属服务器I/O线程在启动之后从主服务器读取。如果您只指定了其中一个,则从属服务器不能指定RELAY_LOG_FILERELAY_LOG_POS。如果MSATER_LOG_FILEMASTER_LOG_POS都没有被指定,则从属服务器会使用在CHANGE MASTER被发布前的最后一个slave SQL thread坐标。当您只想改变要使用的 密码时,这可以确保复制的连续性。即使从属服务器SQL线程落后于从属服务器I/O线程,也可以确保复制的连续性。

    CHANGE MASTER会删除所有的中继日志文件并启动一个新的日志,除非您指定了RELAY_LOG_FILERELAY_LOG_POS。在此情况下,中继日志被保持;relay_log_purge全局变量被静默地设置为0

    CHANGE MASTER TO可以更新master.inforelay-log.info文件的内容。

    当您拥有主服务器快照并拥有日志和对应的偏移量时,CHANGE MASTER对于设置从属服务器是有用的。在把快照载入从属服务器之后,您可以在从属服务器上运行CHANGE MASTER TO MASTER_LOG_FILE=’log_name_on_master‘, MASTER_LOG_POS=log_offset_on_master

    举例说明:

    mysql>CHANGE MASTER TO
         ->    MASTER_HOST='master2.mycompany.com',
         ->    MASTER_USER='replication',
         ->    MASTER_PASSWORD='bigs3cret',
         ->    MASTER_PORT=3306,
         ->    MASTER_LOG_FILE='master2-bin.001',
         ->    MASTER_LOG_POS=4,
         ->    MASTER_CONNECT_RETRY=10;
     
    mysql>CHANGE MASTER TO
         ->    RELAY_LOG_FILE='slave-relay-bin.006',
         ->    RELAY_LOG_POS=4025;

    第一个例子可以更改主服务器及其二进制日志坐标。当想要设置从属服务器来复制主服务器时使用。

    第二个例子显示了较少被使用的一个操作。当从属服务器含有中继日志,并且您出于某种原因想要执行此日志时使用。要这么做时,不需要连接主服务器。您只需要使用CHANGE MASTER TO并启动SQL线程(START SLAVE SQL_THREAD)。

    您甚至可以在一个用于独立非从属服务器的非复制型设置中使用第二种操作,在崩溃之后进行复原。假设您的服务器已崩溃,同时您已恢复了备份。您想要重新播放服务器自己的二进制日志(不是中继日志,而是正规的二进制文件),例如名为myhost-bin.*。首先,应在安全的地方制作这些二进制日志的备份,以防您没有完全遵守以下步骤,意外地让服务器清理了二进制文件。使用SET GLOBAL relay_log_purge=0,进一步增加安全性。然后启动不含–log-bin选项的服务器。使用–replicate-same-server-id,–relay-log=myhost-bin(让服务器相信,这些正规的二进制日志是中继日志)和–skip-slave-startoptions选项。当服务器启动后,发布以下语句:

    mysql>CHANGE MASTER TO
         ->    RELAY_LOG_FILE='myhost-bin.153',
         ->    RELAY_LOG_POS=410,
         ->    MASTER_HOST='some_dummy_string';
    mysql>START SLAVE SQL_THREAD;

    服务器会读取并执行自己的二进制日志,完成崩溃复原。当复原完成后,运行STOP SLAVE,关闭服务器,删除master.inforelay-log.info,并使用原来的选项重新启动服务器。

    要让服务器认为它是一个从属服务器,需要指定MASTER_HOST(甚至使用假值)。

  • Linux下安装部署SNMP(流量监控)

    前言:
    记录我在一台原本没有安装snmp的服务器上通过源码方式安装最新版本snmp的过程。
    1)查原系统是否安装了snmp
    # rpm –qa | grep snmp
    2)下载、解压、配置、编译、安装
    (到http://www.net-snmp.net/download.html上下载最新的net-snmp版本,目前是5.5。)
    # cd /usr/local/src
    # wget http://cdnetworks-kr-2.dl.sourceforge.net/project/net-snmp/net-snmp/5.5/net-snmp-5.5.tar.gz
    # tar zxvf net-snmp-5.5.tar.gz
    # cd net-snmp-5.5
    # ./configure
    (编译中会有交互过程。如选择版本等。)
    # make
    # make install
    3)指令路径说明
    安装完成之后:/usr/local/sbin/snmpd 是启动snmp的程序,snmp的可执行命令(如,snmpget、snmpwalk等)默认安装在/usr/local/bin下。
    4)snmpd.conf文件
    用find / -name snmpd.conf查找一下snmpd.conf文件,可以发现仅有找到以下一条结查:
    /usr/local/src/net-snmp-5.5/python/netsnmp/tests/snmpd.conf
    将其cp到/etc下:
    cp /usr/local/src/net-snmp-5.5/python/netsnmp/tests/snmpd.conf /etc/snmpd.conf
    5)启动snmp
    用以下命令启动snmp:
    # /usr/local/sbin/snmpd -c /etc/snmpd.conf
    (将/usr/local/sbin/snmpd -c /etc/snmpd.conf 加入到/etc/rc.d/rc.local中,成为开机自动启动)
    6)检查snmp启动情况
    用netstat –anu 查一下是否监听:161端口;
    或用 ps –ef |grep snmp可以检查snmpd的进程
    7)测试snmp取数据
    # snmpwalk -c public -v 2c localhost
    看是否可以出现正常的查询结果。
    8)进行snmpd.conf文件的配置
    但此时仅是在本机上可以进行snmp查询,在另一个服务器上是查不到的,所以还要更改一下/etc/snmpd.conf的配置。
    # 1) 设置监控机的IP或监控机的网段,以及团体字映射到安全名
    com2sec local 192.168.10.2      public
    com2sec monitorhost 192.168.10.1      public
    com2sec mynetwork1 92.168.1.0/24     public
    # 2) 映射组名和安全名
    group MyRWGroup v2c        local
    group MyRWGroup v2c        monitorhost
    group MyROGroup v2c        mynetwork
    # 3)设置mib subtree视图
    view all    included  .1                               80
    # 4) 设置read/write权限
    access MyROGroup “”      any       noauth    exact  all    none   none
    access MyRWGroup “”      any       noauth    exact  all    all    none
  • sqlserver 一个sql查询 group by 应用

    select count(userid),left(U_birthday,4) from users where Addtime>dateadd(day,-30,getdate()) group by left(U_birthday,4)

    userid  自增id

    U_birthday 生日 2000-2-5 (格式)

    Addtime 注册时间 2000-2-5 22:33:15(格式)

    查询出最近一个月注册的各个年龄的用户总数