2022年4月

为了消灭家中的低筋面粉库存,找到“奶香馒头”的视频。试着做了一下,不难,吃起来也可以。

松软光滑不塌陷的鲜奶馒头 学会了 这就去跟面粉对线!
https://www.bilibili.com/video/BV1gD4y1m7pL

材料:

  • 牛奶:175g(可换成水,约160g)
  • 中筋/低筋:300g
  • 糖:10g
  • 酵母:3g

做法:

  • 1, 容器(杯子或碗)倒入牛奶,加入酵母化开。
  • 2, 盆子倒入面粉和糖,边加入牛奶边搅拌,然后用手揉成团(太硬可加水,太软可加面粉),盖上盖子静置5分钟。
  • 3, 取出面团,揉到表面光滑,大概10分钟。这一步会影响馒头蒸出来的表面是否光滑。
  • 4, 把面团擀成大概20cm*40cm的面片,手上粘水并抹在面片上,下面长边按薄,从上面长边一直卷下来(尽量避免有空隙),再用手搓成直径4cm左右的长条。
  • 5, 面粉长条切成约4cm长的剂子,并放在蒸笼发酵至1.5倍大(24°C室温约55分钟)。不盖盖子发酵,可以让表皮稍微干燥硬实一点。室温低(特别是冬天)且干燥,最好表皮喷水并盖上盖子,否则表皮太干燥会导致蒸的时候裂开。
  • 6, 开水上锅蒸,上汽(即看到有蒸汽冒出蒸笼)后转为中火,蒸12分钟。蒸后等5分钟再揭开,避免塌陷。

总结:

  • 因为一盒天润牛奶是125g,所以把低筋按比例调整为215g。这个面粉和牛奶的比例刚好,面团不会太湿也不会太干。
  • 我是先把牛奶放微波炉叮半分钟,接近体温,再依次加入糖和酵母。这样更容易激活酵母。
  • 这个配方的面团,应该适合做豆沙包、奶黄包之类。

最近完成了一个小项目的数据库迁移,从微软SQL Server 2016迁移到MySQL 8。过程没什么复杂,只是需要注意一下数据类型和SQL语法的转换。

1 环境

原数据库是SQL Server 2016。迁移的目标环境,操作系统为Debian 11,安装了MySQL 8。

2 还原SQL Server数据库备份

拿到手的是SQL Server数据库备份,需要还原出来再迁移。幸好微软推出了SQL Server的Linux版,而且官方提供了可用于开发测试的Docker镜像,几个步骤就部署并还原好SQL Server数据库。

参考资料:

1)在Debian上安装Docker的官方教程:
Install Docker Engine on Debian
https://docs.docker.com/engine/install/debian/

2)运行SQL Server 2019 Docker镜像的官方教程:
Quickstart: Run SQL Server container images with Docker
https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash

3)SQL Server 2019的微软官方Docker镜像:
dockerhub - Microsoft SQL Server
https://hub.docker.com/_/microsoft-mssql-server

3 MySQL的准备

由于SQL Server的数据库表名不区分大小写,MySQL为了兼容相关SQL语句,也需要设置表名不区分大小写。即设置MySQL的参数lower_case_table_names=1,MySQL在存储和查询时,都把表名转为小写后再执行处理。

这里最麻烦的是,如果MySQL原来设置了lower_case_table_names=0(一般Linux上安装MySQL的默认值),需要把data文件夹清空,更新设置后重新初始化MySQL的数据。如果直接更改该值,MySQL重启后会报错。

关键的操作步骤:

1)修改MySQL的配置文件(Debian的默认路径为:/etc/mysql/mysql.conf.d/mysql.cnf),在[mysqld]节点下,加入一行lower_case_table_names=1

2)重新初始化MySQL(已有数据库的话,先做好备份,初始化后再还原),先清空数据文件夹(Debian的默认路径:/var/lib/mysql),然后执行以下命令:

mysqld --user=root --initialize --lower-case-table-names=1

初始化成功后,root用户的密码会记录在/var/log/mysql/error.log

4 迁移数据库定义

即导出原数据库表的create语句。一般推荐使用MySQL Workbench的Migration功能,官方文档如下:

MySQL Workbench - Using the MySQL Workbench Migration Wizard
https://dev.mysql.com/doc/workbench/en/wb-migration-wizard.html

但是我所安装的MySQL Workbench不能连接到Docker部署的SQL Server,所以使用了已安装的HeidiSQL,导出原数据库表的create table语句,然后手工修正为MySQL的语法。一些修改操作如下:

  • 修正字符编码,特别是设置了COLLATE的,需求改为COLLATE utf8mb4_0900_ai_ci
  • 修正默认值设置,例如DEFAULT '(0)'改为DEFAULT '0'DEFAULT getDate()改为DEFAULT CURRENT_TIMESTAMP
  • 自增型字段会被忽略,需要加上AUTO_INCREMENT
  • 字段类型转换,例如NVARCHAR改为VARCHARBIT改为TININY(1)MONEY改为DECIMAL(19,4)
  • 需要补上索引设置。

5 迁移数据库的数据

即导出所有数据的insert语句,然后在目标数据库利用source命令进行导入。一般也是推荐使用MySQL Workbench操作,不用担心语法和数据类型的问题。

我使用了DBeaver导出所有表的insert语句,然后手工修正为MySQL语法。需要注意:

  • 一般一条insert语句包含10000行数据,已提高导入时的效率。
  • 所有表名以数据库名.dbo开头的,都改为以数据库名开头。
  • 列名以中括号“[]”括住的,要改为“\`”。

6 修改程序的SQL语句

主要是把SQL Server的语法,改为MySQL的语法。总结如下:

  • TOP改为LIMIT
  • getDate()改为CURRENT_TIMESTAMP
  • 去掉表名前的dbo.
  • WITH(NOLOCK)的处理。SQL Server加了WITH(NOLOCK)的语句,如果MySQL的InnoDB设置innodb_autoinc_lock_mode=0,需要特殊处理该语句,否则直接去掉WITH(NOLOCK)。关于InnoDB的设置说明如下:

MySQL innodb_autoinc_lock_mode 详解
https://www.cnblogs.com/JiangLe/p/6362770.html