MySQL分区、定期备份与还原等

1. MySQL分区

1.1. 创建带分区的表的sql语句

create table check_work_v2_suppl
(
    id                  varchar(50)                         not null comment '主键id',
    day_id              date                                not null comment '被补卡日期,yyyy-MM-dd格式日期分区字段',
    project_id          varchar(50)                         null comment '项目id',
    user_id             varchar(50)                         not null comment '打卡用户id',
    leader_id           varchar(50)                         not null comment '打卡用户直属上级领导id',
    clock_in_time       time                                not null comment '上班/下班打卡时间',
    clock_in_location   varchar(500)                        not null comment '打卡地点',
    clock_in_type       int(2)                              not null comment '打卡类型:0-签到,1-签退',
    attendance_type     int(2)                              not null comment '考勤类型:0-日常考勤,1-项目考勤',
    job_content         text                                null comment '工作内容',
    deliverables        text                                null comment '交付物',
    deliverables_status varchar(50)                         null comment '交付物状态',
    approval_status       int(2)    default 0                 not null comment '补卡流程审批状态:0-审批中,1-审批完成',
    update_time         timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '记录被更新时间',
    create_time         timestamp default CURRENT_TIMESTAMP not null comment '记录被创建时间',
    version             bigint    default 0                 not null comment '版本号',
    primary key (id, day_id)
)ENGINE = InnoDB
 DEFAULT CHARSET = utf8 comment '考勤补卡表:存储实际的补卡记录'
    /*!50100 PARTITION BY RANGE (TO_DAYS(day_id))
        (PARTITION p20200701 VALUES LESS THAN (737972) ENGINE = InnoDB,
        PARTITION p20200702 VALUES LESS THAN (737973) ENGINE = InnoDB,
        PARTITION p20200703 VALUES LESS THAN (737974) ENGINE = InnoDB,
        PARTITION p20200704 VALUES LESS THAN (737975) ENGINE = InnoDB,
        PARTITION p20200705 VALUES LESS THAN (737976) ENGINE = InnoDB,
        PARTITION p20200706 VALUES LESS THAN (737977) ENGINE = InnoDB,
        PARTITION p20200707 VALUES LESS THAN (737978) ENGINE = InnoDB,
        PARTITION p20200708 VALUES LESS THAN (737979) ENGINE = InnoDB,
        PARTITION p20200709 VALUES LESS THAN (737980) ENGINE = InnoDB,
        PARTITION p20200710 VALUES LESS THAN (737981) ENGINE = InnoDB,
        PARTITION p20200711 VALUES LESS THAN (737982) ENGINE = InnoDB,
        PARTITION p20200712 VALUES LESS THAN (737983) ENGINE = InnoDB,
        PARTITION p20200713 VALUES LESS THAN (737984) ENGINE = InnoDB,
        PARTITION p20200714 VALUES LESS THAN (737985) ENGINE = InnoDB,
        PARTITION p20200715 VALUES LESS THAN (737986) ENGINE = InnoDB) */

1.2. 查看见表语句

 show create table check_work_v2_suppl

1.3. 单独添加分区

alter table check_work_v2 PARTITION BY RANGE (TO_DAYS(day_id)) (
    PARTITION p20200701 VALUES LESS THAN (TO_DAYS('20200701')),
    PARTITION p20200702 VALUES LESS THAN (TO_DAYS('20200702')),
    PARTITION p20200703 VALUES LESS THAN (TO_DAYS('20200703')),
    PARTITION p20200704 VALUES LESS THAN (TO_DAYS('20200704')),
    PARTITION p20200705 VALUES LESS THAN (TO_DAYS('20200705')),
    PARTITION p20200706 VALUES LESS THAN (TO_DAYS('20200706')),
    PARTITION p20200707 VALUES LESS THAN (TO_DAYS('20200707')),
    PARTITION p20200708 VALUES LESS THAN (TO_DAYS('20200708')),
    PARTITION p20200709 VALUES LESS THAN (TO_DAYS('20200709')),
    PARTITION p20200710 VALUES LESS THAN (TO_DAYS('20200710'))
	);

alter table check_work_v2 add partition (PARTITION p20200712 VALUES LESS THAN (TO_DAYS('20200712')))
alter table check_work_v2 add partition (PARTITION p20200713 VALUES LESS THAN (TO_DAYS('20200713')))
alter table check_work_v2 add partition (PARTITION p20200714 VALUES LESS THAN (TO_DAYS('20200714')))
alter table check_work_v2 add partition (PARTITION p20200715 VALUES LESS THAN (TO_DAYS('20200715')))

1.4. 创建联合主键

 alter table check_work_v2 add primary key (id,day_id);

1.5. 查询分区

select
    partition_name part,
    partition_expression expr,
    partition_description descr,
    table_rows
from information_schema.partitions  where
        table_schema = schema()
and table_name='check_work_v2'
order by part desc ;

1.6.定期增加分区

1.6.1.Range带TO_DAYS函数自动创建分区:

https://www.cnblogs.com/wangsongbai/p/12836438.html

1.6.2.Range不带TO_DAYS函数自动创建分区:

原文链接:
https://blog.csdn.net/m582445672/article/details/7670743

使用说明:

1.此脚本为分区后,定时自动增加分区.(被自动分区的表,一定要先手动分几个区)

2.每隔15天,定时器会执行一个存储过程,对分区日期最后的那天再往后新增15个分区.
3.Script里面Auto_partitions.sql 为存储过程

4.Script里面Timer_event.sql 为定时事件脚本

5.MySQL5.5默认并没有开启EVENT机制,需要在my.cnf文件中添加[mysqld] event_scheduler= ON
开启事件:
原文:
https://my.oschina.net/lwenhao/blog/2875029

7.增加打开文件上线.这个很重要.open_files_limit = 5000

传入参数:
databaseName为数据库名
tableName为表名

  • 存储过程
DELIMITER ||
DROP PROCEDURE IF EXISTS create_Partition ||
CREATE PROCEDURE create_Partition (IN databaseName VARCHAR(50),IN tableName VARCHAR(50))
L_END:BEGIN     
     DECLARE MAX_PARTITION_DESCRIPTION VARCHAR(255) DEFAULT 0;
     DECLARE P_NAME VARCHAR(255) DEFAULT 0;       
     DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;   
     DECLARE i INT DEFAULT 1;
     DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0; 
     SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName  LIMIT 1 ;
      
     IF ISEXIST_PARTITION <=> "" THEN
       SELECT "Partition table not is exist" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;
 
     SELECT partition_description INTO MAX_PARTITION_DESCRIPTION  FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName ORDER BY partition_description DESC LIMIT 1;
       
       
     IF MAX_PARTITION_DESCRIPTION <=> "" THEN
       SELECT "Partition table is error" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;
 
      
    SET MAX_PARTITION_DESCRIPTION = REPLACE(MAX_PARTITION_DESCRIPTION, '\'', '');
    WHILE i <= 15 DO
           SET P_DESCRIPTION = adddate(MAX_PARTITION_DESCRIPTION, INTERVAL i day);
           SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
           SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION  (PARTITION p',P_NAME,' VALUES LESS THAN (\'',P_DESCRIPTION,'\'))');
           SELECT @S;
           PREPARE stmt2 FROM @S;
           EXECUTE stmt2;
           DEALLOCATE PREPARE stmt2;
           SET i = i + 1 ;
    END WHILE;          
END L_END;||
DELIMITER ;
  • 定时事件:
DELIMITER ||
CREATE EVENT auto_set_partitions
          ON SCHEDULE
          EVERY 15 DAY 
          DO
	  BEGIN
          CALL create_Partition('database_name','table_name');
         /* 如果需要向多个表分区,可以写多个 CALL 调用  
          CALL create_Partition('database_name','table_name');
        */
 END ||
DELIMITER ;

1.7.查看事件执行情况

原文:
https://www.cnblogs.com/mincyw/archive/2011/02/22/1960983.html
https://blog.csdn.net/tcy23456/article/details/81161555?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

SELECT * FROM information_schema.EVENTS;

2. 定期备份与还原数据库

2.1.备份sql

# 
# 描述:备份单个MySQL数据库的数据和结构
# 日期: 2020-07-09
# 作者:hero
#

#!/bin/bash
# 判断是否传参(数据库名)
if [ $# -eq 0 ];
then
	echo "error:请指定要备份的数据库名!"
	echo "e.g.:$0 mydb"
	exit 1
fi
#保存备份个数,备份31天数据
number=31
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=123456
#将要备份的数据库
database_name=$1

#如果文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi

#简单写法:
# $tool -u $username -p$password $database_name > $backup_dir/$database_name-$dd.sql
#压缩备份写法:
$tool -u $username -p$password $database_name | gzip > $backup_dir/$database_name-$dd.sql.gz

#写创建备份日志
# echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt

#找出需要删除的备份
delfile=`ls -l -crt  $backup_dir/*.sql.gz | awk '{print $9 }' | head -1`

#判断现在的备份数量是否大于$number
count=`ls -l -crt  $backup_dir/*.sql.gz | awk '{print $9 }' | wc -l`

if [ $count -gt $number ]
then
  #删除最早生成的备份,只保留number数量的备份
  rm $delfile
  #写删除文件日志
  echo "delete $delfile" >> $backup_dir/log.txt
fi

1.定期备份和还原参考:
https://www.cnblogs.com/eternal1025/p/8554225.html
https://www.cnblogs.com/hellangels333/p/9059770.html
https://www.cnblogs.com/djlsunshine/p/10937403.html
2.分区和索引参考:
https://www.cnblogs.com/jianmingyuan/p/6740090.html
https://blog.csdn.net/m582445672/article/details/7670743
http://blog.chinaunix.net/uid-24086995-id-127389.html

猜你喜欢

转载自blog.csdn.net/weixin_41085114/article/details/107190944