Shrink database is an easy task to do it. As you know, you never set your database with the option auto shrink. It’s better to set the estimated size for your database at the beginning of production.
The first thing to do is to estimate the time who will take the shrink. The second is the schedule a down time. The last is to shrink the database by data file.
Something you couldn’t shrink the database
1. You could to see if there are open transactions.
2. If there is no open transaction, you could take a backup of the transaction log, put in simple recovery mode and then put back to the full or bulk log recovery mode and then shrink.
3. If that action doesn’t work, create an empty data file and take the option to shrink with move all the data to the new data file. If you receive a message, could not transfer all the data to the new data file, is because there are maybe some table who contain data type Text or image. In that case you need to find which tables are still in the data file, and then you need to create those tables with prefix temp and transfer all the data into it. After you delete the original table and rename all tables with prefix temp.
4. Don’t forget to create all constraint, trigger, index for the new tables. Create all indexes after the transfer of the data to optimize the transfer time.
If you need more information’s you could send me a mail.