标签归档:mysql

mysql通过存储过程以及事务批量生成数据

存储过程加上事务能够提高插入效率:

CREATE DEFINER=`root`@`%` PROCEDURE `autoinsert`(IN NUM INT)
BEGIN
  DECLARE INIT_NUM INT DEFAULT 0 ;
    START TRANSACTION;
    WHILE(INIT_NUM < NUM)
    DO
        insert into `user`(`name`,`city_id`) values(rand_str(10),rand_int(2));
        SET INIT_NUM = INIT_NUM+1;
    END WHILE;
    COMMIT;
    END

CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `forum_id` bigint(20) unsigned NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `test_forum_id_IDX` (`forum_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=750136 DEFAULT CHARSET=utf8mb4

DROP PROCEDURE IF EXISTS test.BatchInsertTest;
delimiter //
CREATE PROCEDURE BatchInsertTest(IN loop_time INT)
  BEGIN
      DECLARE Var INT;
      SET Var = 0;
      START TRANSACTION;
      WHILE Var < loop_time DO
          INSERT INTO `test` ( `forum_id`, `created`) select  FLOOR(1 + (RAND() * 1000)),FROM_UNIXTIME(UNIX_TIMESTAMP()-(RAND() * 30 * 86400));
          SET Var = Var + 1;
      END WHILE;
     COMMIT;
  END;
  //
delimiter ;

CALL BatchInsertTest(10000);

select count(*) from test;

mysql生成固定位数随机字母以及数字

mysql生成固定位数随机字母以及数字

随机数字

CREATE DEFINER=`root`@`%` FUNCTION `rand_int`(counts INTEGER) RETURNS varchar(20) CHARSET utf8
BEGIN
       DECLARE sTemp VARCHAR(20);
    DECLARE sTempCounts INTEGER;
       SET sTemp = CONCAT( ROUND(ROUND(RAND(),counts)*(POW(10,counts))),'');

    IF(CHAR_LENGTH(sTemp)<counts) THEN

      SET sTempCounts = counts - CHAR_LENGTH(sTemp);
      SET sTemp = CONCAT(sTemp, RIGHT(CONCAT(POW(10,sTempCounts),''),sTempCounts));
    END IF;
      RETURN sTemp;
END

随机字母:

CREATE DEFINER=`root`@`%` FUNCTION `rand_str`(  
    f_num INT UNSIGNED
    ) RETURNS varchar(200) CHARSET latin1
BEGIN
      DECLARE i INT UNSIGNED DEFAULT 0;   
      DECLARE v_result VARCHAR(200) DEFAULT '';   
      DECLARE v_dict VARCHAR(200) DEFAULT '';  
      SET v_dict = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';  
      SET v_dict = LPAD(v_dict,200,v_dict);  
      WHILE i < f_num   
      DO   
        SET v_result = CONCAT(v_result,SUBSTR(v_dict,CEIL(RAND()*200),1));  
        SET i = i + 1;   
      END WHILE;    
      RETURN v_result;   
END

mysql切换主库记录

原来公司采用的是异地Mysql机房。三台机器是A(主)->B(从,主)->C(从)模式。

今天因为测试磁盘性能不小心将B磁盘数据弄没了。(直接将这篇文章的sdb1换成sda2然后整个磁盘数据没有了)

于是要将C的主库从B切换到A上。

在C上找到最后同步的binlog

show slave status

在C上找到binlog的最后同步点

sudo mysqlbinlog --base64-output=decode-rows -v --set-charset=utf8  /home/mysql/mysql-bin.000015 --start-datetime="2016-12-19 11:38:00" --stop-datetime="2016-12-19 11:39:00"

在A上找到对应的同步点

mysqlbinlog  --base64-output=decode-rows -v --set-charset=utf8 /data/mysql/mysql-bin.001232 --start-datetime="2016-12-19 11:38:00" --stop-datetime="2016-12-19 11:38:50"

开始同步

change master to master_host=’x.x.x.x’, master_user=’slave’, master_password=’********’, master_log_file=’mysql-bin.001232′, master_log_pos=648129189;

同步发现没有权限,增加同步权限

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'x.x.x.x' IDENTIFIED BY 'password';

解决同步时出现Cannot execute the current event group in the parallel mode错误

set global slave_parallel_workers=0;

php mysql实现非连续不重复ID

非连续ID有很多用处.最大的一个用处就是作为订单id,用户id之类的不想让别人遍历(直接通过请求里面传id值来爬你的数据),以及不想让别人看出来你有多少数据量(如果是连续id,应用有多少订单,一目了然)的id.

mysql的实现方法

添加一个触发器,每次插入的时候通过取当前最大的id然后加一个随机数得到新的id.

   CREATE TRIGGER `rand_increase` BEFORE INSERT ON `users` FOR EACH ROW SET NEW.id=(SELECT max(id) FROM users)+FLOOR(RAND()*500)

php的实现方法

生成一个ID,到数据库里面查看ID是否存在,如果存在,再生成一个.

class model
{
    public function generateRandomId($length=15) {
        $random = "";
        for ($i = 0; $i < $length; $i++) {
            $random .= mt_rand(0, 9);
        }
        return $random;
    }
    public function beforeInsert() {
        do{
            $inserId=$this->generateRandomId(10);
        }while(!$this->selectById($inserId));
        $this->insertId=$inserId;
    }
}

理论上,在超高并发条件下,这两种方法都不是完美的解决办法,但是实际上只要你的id不是太短(比如15位以上?),不完美发生的概率非常非常非常非常非常非常非常非常小.

来源:php mysql实现非连续不重复ID

mysql批量导入导出

备份数据库到脚本(20分钟)

mysqldump -u username -p password --all-databases --flush-privileges | gzip  > all.sql.gz

拷贝到新机器(20分钟)

scp -P xxx -r all.sql.gz root@host:~

解压缩(2分钟)

gunzip  all.sql.gz 

解决掉视图权限问题(1分钟)

sed '/\/*!50013/d' all.sql  > all_without_50013.sql

导入(40分钟)

mysql -u username -p password < all_without_50013.sql

mysql导入视图错误ERROR 1449

MYSQL导入时,如果存在视图,可能导致导入不成功,错误提示: ERROR 1449(HY000) at line xxx: The user specified as a definer (‘xxx’@’xxx’) does not exist

解决办法1:

sed '/\/*!50013/d' backup.sql > backup_without_50013.sql

解决办法2:

$contents = file_get_contents('backups/backup.sql');
$contents = preg_replace('@/*!50013 DEFINER.*?*/@' , '' , $contents);
file_put_contents('backups/backup.sql' , $contents);

Import mysql dump files with view definer and sql security

mysql配置优化

SHOW VARIABLES LIKE ‘%cache%’;
+——————————+———————-+
| Variable_name | Value |
+——————————+———————-+
| binlog_cache_size | 32768 |
| binlog_stmt_cache_size | 32768 |
| have_flashcache | YES |
| have_query_cache | YES |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| metadata_locks_cache_size | 1024 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| stored_program_cache | 256 |
| table_definition_cache | 400 |
| table_open_cache | 400 |
| thread_cache_size | 8 |
+——————————+———————-+

show status like ‘%cache%’;
+——————————–+———-+
| Variable_name | Value |
+——————————–+———-+
| Binlog_cache_disk_use | 2 |
| Binlog_cache_use | 15514049 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 1170 |
| Com_assign_to_keycache | 0 |
| Flashcache_enabled | OFF |
| Qcache_free_blocks | 2005 |
| Qcache_free_memory | 6565712 |
| Qcache_hits | 77732 |
| Qcache_inserts | 590516 |
| Qcache_lowmem_prunes | 557510 |
| Qcache_not_cached | 338374 |
| Qcache_queries_in_cache | 7191 |
| Qcache_total_blocks | 16631 |
| Ssl_callback_cache_hits | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | NONE |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 0 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_used_session_cache_entries | 0 |
| Threads_cached | 3 |
+——————————–+———-+

 

mysql缓存参数
MYSQL缓冲区和缓存设置
MySQL 数据库性能优化之缓存参数优化
MySQL写入优化