写在前面

这里总结下Mysql中积累的一些批量操作

Mysql 系统中内置了两个很重要的数据库Mysql、information_schema、sys 还有performance_schema,后续我们自创的DB都在这四个表里有相应维护

这里有关于这四个数据库的更详细的介绍

这里的脚本总结,也差不多都是基于这四个系统内置数据库中的相关维护,批量操作我们的业务数据库

包括以下

一、批量更改数据库的字符集(数据库、表,字段等)

1.1、修改数据库字符集

-- 可直接复制运行
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin; 
-- 参数解释:
    -- db_name 数据库名;
    -- utf8mb4 改后的字符集
    -- utf8mb4_bin 改后的排序规则

1.2、批量修改某一数据库中,所有的表和表中的字段的编码和排序规则

– 第一步,先生成修改的SQL语句

USE testboot;
SELECT
	CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME,
' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) 
FROM
	information_schema.`COLUMNS` 
WHERE
	COLLATION_NAME RLIKE 'utf8mb4_general_ci' 
	AND TABLE_SCHEMA = 'testboot';

-- 参数解释
    -- testboot 你要修改的数据库
    -- utf8mb4 改后的编码
    -- 第一个 utf8mb4_general_ci 改后的排序规则
    -- 第二个 utf8mb4_general_ci 要改的表的现在的排序规则,这里本来是utf8mb4_bin,我改过的,用utf8mb4_bin,会返回空
    -- testboot 你要修改的数据库

类似这种

ALTER TABLE testboot.address MODIFY COLUMN address varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.address MODIFY COLUMN city varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.address MODIFY COLUMN province varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.blog MODIFY COLUMN content longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.blog MODIFY COLUMN description varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.blog MODIFY COLUMN summary varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.blog MODIFY COLUMN tags varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.blog MODIFY COLUMN title varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.navigation MODIFY COLUMN name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.navigation MODIFY COLUMN path varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.user MODIFY COLUMN email varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.user MODIFY COLUMN name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.user MODIFY COLUMN password varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE testboot.user MODIFY COLUMN tel varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

第二步,复制上述生成sql语句,在控制台里执行就可以了

注意这里会初始化字段的注释,字段长度,只供参考

修改完毕;可查看。

二、批量添加注释

2.1、批量添加表注释

SELECT distinct CONCAT(
                        'ALTER TABLE ', TABLE_NAME,
                        ' COMMENT ', ';') as tname
FROM information_schema.`COLUMNS`
where TABLE_SCHEMA = 'pis-test'
  and TABLE_NAME = 'pis_user';

可得到如下,具体注释值,就需要你再补充了

ALTER TABLE pis_absence COMMENT '';
ALTER TABLE pis_clock COMMENT '';
ALTER TABLE pis_config COMMENT '';
ALTER TABLE pis_contract COMMENT '';
ALTER TABLE pis_department COMMENT '';
ALTER TABLE pis_dictionary COMMENT '';
ALTER TABLE pis_finance COMMENT '';
ALTER TABLE pis_group COMMENT '';
ALTER TABLE pis_leave_msg COMMENT '';

2.2、批量添加表字段注释

表注释完成后,就需要添加表中字段的注释了,这个就稍微麻烦一点,因为我们只是要更新添加字段注释,又要小心因 alter 语句引起的表结构的变化,这个要特别注意下!!

这里我是区分每一个表操作的(每一个表,整理出一份注释alter脚本),示例其中一个表

方式一

show create table pis_config;

得到如下,我们Copy出需要修改的部分??这里需要注意一下!Mysql对field修改时,是需要完整的字段定义的()

CREATE TABLE `pis_config` (
  `id_` bigint(20) NOT NULL AUTO_INCREMENT ,
  `create_by` varchar(255) DEFAULT NULL ,
  `create_time` datetime DEFAULT NULL ,
  `key_` varchar(255) DEFAULT NULL ,
  `summary_` varchar(255) DEFAULT NULL ,
  `update_by` varchar(255) DEFAULT NULL ,
  `update_time` datetime DEFAULT NULL ,
  `value_` varchar(255) DEFAULT NULL ,
  PRIMARY KEY (`id_`),
  UNIQUE KEY `key_` (`key_`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8 

Copy出之后,通过多行编辑器操作拼接如下

  • ALTER TABLE pis_user MODIFY COLUMN user_id bigint(20) comment ‘ss’;

方式二

SELECT CONCAT(
               'ALTER TABLE ', TABLE_NAME,
               ' MODIFY COLUMN ', COLUMN_NAME,
               ' ', COLUMN_TYPE,
               ' comment ',  'zzz ',' ;')
FROM information_schema.`COLUMNS`
where TABLE_SCHEMA = 'pis'
  and TABLE_NAME = 'pis_user';

可获得如下

ALTER TABLE pis_user MODIFY COLUMN user_id bigint(20) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN assess_ int(11) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN company_ varchar(255) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN create_by varchar(255) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN create_time datetime comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN department_id bigint(20) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN department_name varchar(255) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN email_ varchar(255) comment  zzz  ;
ALTER TABLE pis_user MODIFY COLUMN entrance_status int(11) comment  zzz  ;
...
...

2.3、待完善的地方

这里用存储过程或者函数处理会更方便,待完善,后面我会抽空补全以下

-- 这里先记录一下,可供参考的shell,待写自定义函数处理批量表字段
SHOW COLUMNS FROM pis_user FROM `pis-test`;
SELECT table_name, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
# WHERE table_name = 'pis_user';
WHERE table_schema = 'pis-test';

SELECT table_name, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'pis-test';

SELECT CONCAT(
    'ALTER TABLE ', TABLE_NAME,
    ' MODIFY COLUMN ', COLUMN_NAME,
              ' ', COLUMN_TYPE)
FROM information_schema.`COLUMNS` where TABLE_SCHEMA = 'pis-test' and TABLE_NAME = 'pis_user';
show create table pis_user;

三、数据传输(复制、导入、导出)

这里只用 Mysql shell操作,如果可用 Navicate或其他连接客户端工具,可参考链接,这里有更便捷的操作方式,可供参考

3.1、数据导出 -mysqldump

命令行(mysql命令界面外)

-- 指定文件位置
mysqldump -uroot -p pis > d:\mydb.sqlpiss.sql;
mysqldump -u root -p mydatabase > /home/myuser/database-dump.sql

mysqldump -u [user] -p [db_name] | gzip > [filename_to_compress.sql.gz] 
gunzip < [compressed_filename.sql.gz]  | mysql -u [user] -p[password] [databasename] 

-- 备注年月日
mysqldump -u[username] -p[userpassword] --databases yourdatabase | gzip > /home/pi/database_backup/database_`date '+%m-%d-%Y'`.sql.gz

3.3、数据复制 – Select … into…

这里相当于中间表的使用

SELECT A.LastName,B.OrderNo
INTO AB
FROM A
INNER JOIN B
ON A.id=B.id

几个问题

这种操作会是同步的吗?还是基于当前语句的时间点复制数据 ?

3.2、数据导入

这里包括

五、数据备份/恢复

5.1、备份

这里有几个很重要的问题

备份的意义是什么,以及如何看待不同的备份?

如何保持数据的一致性?当我们从某个数据库备份数据时,确保里面的最后更新记录?和当前备份的一致性?

备份和导出的区别?

5.1、恢复

几个问题

备份和导入的区别?
要恢复什么数据 ?基于某个时间点 ?还是某个某种业务下的数据丢失问题 ?

六、数据库表比对

七、shell脚本

7.1、导出脚本

echo -e "Welcome to the import/export database utility\n"
echo -e "the default location of mysqldump file is: /opt/lampp/bin/mysqldump\n"
echo -e "the default location of mysql file is: /opt/lampp/bin/mysql\n"
read -p 'Would like you like to change the default location [y/n]: ' location_change
read -p "Please enter your username: " u_name
read -p 'Would you like to import or export a database: [import/export]: ' action
echo

mysqldump_location=/opt/lampp/bin/mysqldump
mysql_location=/opt/lampp/bin/mysql

if [ "$action" == "export" ]; then
    if [ "$location_change" == "y" ]; then
        read -p 'Give the location of mysqldump that you want to use: ' mysqldump_location
        echo
    else
        echo -e "Using default location of mysqldump\n"
    fi
    read -p 'Give the name of database in which you would like to export: ' db_name
    read -p 'Give the complete path of the .sql file in which you would like to export the database: ' sql_file
    $mysqldump_location -u $u_name -p $db_name > $sql_file
elif [ "$action" == "import" ]; then
    if [ "$location_change" == "y" ]; then
        read -p 'Give the location of mysql that you want to use: ' mysql_location
        echo
    else
        echo -e "Using default location of mysql\n"
    fi
    read -p 'Give the complete path of the .sql file you would like to import: ' sql_file
    read -p 'Give the name of database in which to import this file: ' db_name
    $mysql_location -u $u_name -p $db_name < $sql_file
else
    echo "please select a valid command"
fi

7.2、备份脚本

7.3、恢复数据脚本

八、数据库、表、字段导出Excel

8.1、导出SQL

SELECT
	a.table_comment 表说明,
	a.table_name 表名,

	b.COLUMN_NAME 字段名,
	b.column_comment 字段说明,
	b.column_type 字段类型,
	b.column_key 约束
FROM
	information_schema. TABLES a
		LEFT JOIN information_schema.COLUMNS b ON a.table_name = b.TABLE_NAME
WHERE
      -- 数据库名称
		a.table_schema = 'xxx'
ORDER BY
	a.table_name;

将结果复制到excel即可…

8.2、