How to restart MS SQL server right, what is best practice to do that?
You almost certainly have a very large number of virtual log files (VLFs) in the problematic log file of the database in question.  Shutting down and restarting SQL Server causes the recovery process to run on all databases on the instance.  For databases that have a very large number of VLFs this process can be agonizingly slow.

You can see the VLFs via this DBCC command:

DBCC LOGINFO;


Each row represents one VLF.  How many do you have?  I'm betting you have a very high number of VLFs (rows).

You can rebuild the log file to remove the excess VLFs; simply shrink the log file, then grow it in sensible increments to the prior size.

I wrote a blog post showing how to do that here.

If you're concerned about shutting down the SQL Server instance without causing recovery to run, you can issue this command before you shut down SQL Server:

shutdown;


However, if there are existing connections, the command will wait until all connections are closed.  See the Microsoft docs for more detail.  SHUTDOWN WITH NOWAIT; will cause SQL Server to immediately shutdown, without waiting for existing connections to close, however this will trigger recovery at the next startup, and is exactly what happens when you shutdown the instance via the control panel, or via shutting down the server itself.