bet.ucoz.co.uk

Posts Tagged ‘Management’

SQL Server: Database Page Basics November 22nd, 2012

Vinod Kumar

As you have been reading multiple posts around the database fundamentals topic in the past few weeks. Here is yet another post that will discuss around the basics of SQL Server Database Pages concept. I have seen there are many junior DBA’s who come from other platforms and ask what is a page, why is it restrictive, Is there a way to configure, are there optimizations I need to be aware etc. For most part the answer to this question is – there is hardly anything we can configure as parameters, but there is a reason why one must learn why SQL Server uses these defaults, what are the nuances we need to be aware and how can we understand the inner working. In this post, we just take a look at the basics of what constitute a database page and what are the various functions of each of these page types. This is not exhaustive, but still the learning can never stop right :).

  1. Logical pages are 8KB in size by design and default.
  2. The pages are numbered sequentially from 0 to N in each file, while the size of the file decides the number of pages that it contains.
  3. SQL Server can identify any page using the database-id, file-id and page-number combination. Many times there are error messages with this nomenclature for reference.
  4. With all math done, it means SQL Server has 128 pages per MB.
  5. When new space is allocated to a file because of expanding file, the first page of the newly created space is page# is N + 1.
  6. Though shrinking removes pages, SQL Server also ensures page numbers within a file are always contiguous.

SPACE ALLOCATIONS

  1. Space in a database file is managed in units called extents.
  2. Extent is made up of 8 logically contiguous pages therefore having a capacity of 64KB.
  3. 96 byte of each page is allocated for header information such as what type of page, amount of free space on page, object owing it etc.
  4. Post the header information is the data rows placed serially.
  5. Bottom of the page contains a row offset – there is one entry for every row inside that page and its offset from the start of the page.
  6. Row Offsets are in reverse sequence from the sequence of the rows.
  7. Maximum amount of data that one can store in a single row is 8060 bytes. Whenever we are able to fit the rows in this limit – it is called In-Row Data.
    1. From SQL 2008, the page restriction has been relaxed with an concept called as Row-Overflow Data. Read more from MSDN.
  8. SQL Server doesn’t allocate entire extents to tables which have small amounts of data.
  9. Extents are of 2 Types:
    1. Uniform extents: As name suggests it is owned by a single object; all eight pages in the extent can be used only by this single object
    2. Mixed extents: These are shared between objects. Up to eight objects can share an extent (a.k.a each object using a single page)
  10. Whenever a new table or index needs allocation it is given a mixed extents; when the table or index grows to eight pages, future allocations can use uniform extents. Between versions of SQL Server the # of pages post which uniform extents are given may vary.
  11. If a table or index needs more space and is still less than 8 pages total, SQL Server must find a mixed extent with space available, else if it is 8 pages or larger, uniform extents are located.
  12. When there is no mixed extents with free space, a new extent marked as mixed extent is allocated and SGAM updated accordingly.
  13. Basic Page Layouts:
    1. Page 0 is the File Header
    2. Page 1 is the Page Free Space (PFS)
    3. Page 2 is GAM
    4. Page 3 is SGAM
    5. Page 6 is Differential Changed Map (DCM)
    6. Page 7 is Bulk Changed Map (BCM)
  14. 2 special types of pages to record which extents have been allocated and what type it is being use for:
    1. Global Allocation Map (GAM) pages (always on page 2)

      1. These pages record which extents have been allocated for any type of use.
      2. GAM has a bit to indicate value 0 means in use and 1 means free extent.
      3. After header and other overhead are accounted, there are 8000 bytes or 64000 bits to cover 64000 extents.
      4. Each GAM page covers 4 GB of data and a GAM page exists in a file for every 4 GB of file size.
    2. Shared Global Allocation Map (SGAM) pages (always on page 3)
      1. Record which extents are currently used as mixed events and have at least one unused page.
      2. Similar to GAM, it covers 64000 extents every 4GB of data.
      3. Has a bit for each extent in the interval it covers: 1 if the extent is being used a mixed extent and has free pages, 0 if the extent isn’t being used a mixed extent or it’s a mixed extent with no free pages

Index Allocation Maps (IAM)

  1. Any structure of data or index needs an IAM page.
  2. IAM pages keep track of the extents in a 4 GB section of a database file.
  3. An allocation unit is a set of pages belonging to a single partition in a table or index. The pages of can be of three storage types:
    1. Pages with regular in-row data
    2. Pages with Large Object (LOB) data
    3. Pages with row-overflow data
  4. IAM page contains a 96 byte page header, followed by IAM header which contains 8 page-pointer slots.
  5. IAM pages contain a set of 8 bits that map a range of extents onto a file. The IAM header has the address of the first extent in the range mapped by the IAM.
  6. A bit in the IAM bitmap represents an extent in the range: 1 means extent is allocated to the object owning the IAM, 0 means the extent isn’t allocated to the object owning the IAM.
  7. IAMs are allocated as needed for each object. Each of the IAM covers a possible range of 512,000 pages.

Misc. Notes

  1. PFS (page 1) – keeps track of how each particular page in a file is used.
  2. PFS also tracks if the page is empty, 1 to 50 percent full, 51 to 80 percent full, 81 to 95 percent full or 96 to 100 percent full.
  3. There is a PFS page approximately 8,000 pages in size after the first PFS page.
  4. Differential Changed Map (DCM page 6) – keeps track of which extents in a file have been modified since the last full database backup.
  5. Bulk Changed Map (BCM page 7)- is used when a page in a file is in a minimally or bulk-logged operation.
  6. Like the GAM and SGAM pages, DCM and BCM pages have 1 bit for each extent in the section of the file they represent.
  7. There is a GAM page 64,000 extents after the first GAM page on page 2 and another SGAM page 64,000 extents after the first SGAM page on page 3.
  8. Log files donot have the concepts of pages, they are a series of log entries written sequentially.
  9. In the previous versions the text, ntext and image data are stored in separate pages and are not inside the Data pages.

I think I have touched most parts of how database pages exist inside SQL Server. Though there are even more subtle nuances on the page functioning, we will keep it outside of this post for later. Please refer to MSDN BOL for more information on the page architectures.

Continue reading...


 

SQL Server: Database Basics November 19th, 2012

Vinod Kumar

Database learning can never stop. Based on the previous posts on the basics I saw few comments asking to cover some of the basics in a one liner mode. In this blog post, we will talk about the database fundamentals of system DB’s, what are the DB files and what are the filegroups. I get an opportunity to talk to a lot of developers who come from the compete platform and are often asking these fundamental and basic questions. I am sure this blog post will help them understand these fundamentals.

System Databases

  1. Master: composed of system tables that keep track of server installation as a whole and all other databases that are eventually created. Master DB has system catalogs that keep info about disk space, file allocations and usage, configuration settings, endpoints, logins, etc.
  2. Model: template database. Gets cloned when a new database is created. Any changes that one would like be applied by default to a new database should be made here
  3. Tempdb: re-created every time SQL Server instance is restarted. Holds intermediate results created internally by SQL Server during query processing and sorting, maintaining row versions, etc. Recreated from the model database. Sizing and configuration of tempdb is critical for SQL Server performance.
  4. Resource [hidden database]: stores executable system objects such as stored system procedures and functions. Allows for very fast and safe upgrades.
  5. MSDB: used by the SQL Server Agent service and other companion services. Used for backups, replication tasks, Service Broker, supports jobs, alerts, log shipping, policies, database mail and recovery of damaged pages.

Database Files

  1. Primary data files: every database must have at least one primary data file that keeps track of all the rest of the files in the database. Has the extension .mdf.
  2. Secondary data files: a database may have zero or more secondary data files. Has the extension .ndf.
  3. Log files: every database has at least one log file that contains information necessary to recover all transactions in a database. Has the extension .ldf.

Creating a Database

  1. New user database files must be at least 3 MB or larger including the transaction log
  2. The default size of the data file is the size of the primary data file of the model database (2 MB) and the default size of the log file is 0.5 MB
  3. If LOG ON is not specified but data files are specified during a create database, the size of the log file is 25% of the sum of the sizes of all the data files.

Expanding or Shrinking a Database

  1. Automatic File Expansion:
  1. The file property FILEGROWTH determines how automatic expansion happens
  2. File property MAXSIZE sets the upper limit on the size
  • Manual File Expansion: use the ALTER DATABASE command with the MODIFY FILE option to change the SIZE property to increase the database file size
  • Fast File Initialization: adds space to the data file without filling the newly added space with zeros. New disk content is overwritten as new data is written to the files. Security is managed through Windows security setting SE_MANAGE_VOLUME_NAME
  • Automatic Shrinkage:
    1. Same as doing DBCC SHRINKDATABASE (dbname, 25). Leave 25 % free space in the database after the shrink
    2. Thread performs autoshrink as often as 30 minutes, very resource intensive
  • Manual Shrinkage: use DBCC SHRINKDATABASE if you want to shrink.
  • I highly recommend not to shrink the database.
  • Filegroups

    1. Can group data files for a database into filegroups for allocation and administration purposes.
    2. Improves performance by controlling the placement of data and indexes into specific filegroups on specific drives or volumes.
    3. Filegroup containing the primary data file is called the primary filegroup, there is only one primary filegroup.
    4. Default filegroup: there is at least one filegroup with the property of DEFAULT, can be changed by DBA.
    5. Use cases when -not- to use filegroups:
    1. DBA might decide to spread out the I/O for a database: easiest way is to create a database file on a RAID device.
    2. DBA might want multiple files, perhaps to create a database that uses more space than is available on a single drive: can be accomplished by doing CREATE DATABASE with a list of files on separate drives
  • Use cases when you want to use filegroups:
    1. DBA might want to have different tables assigned to different drives or to use the table and index partitioning feature in SQL Server.
  • Benefits:
    1. Allows backup of parts of the database.
    2. Table is created on a single filegroup, allows for backup of critical tables by backing up selected filegroups.
    3. Same for restoration. Database can be online as soon as primary filegroup is restored, but only objects on the restored filegroups will be available.

    Given the nature of content, also look at the other topics we have discussed before.

    Concurrency Basics

    Locking Basics

    Transaction Log Basics

    Thanks for reading this far. Feel free to pass your comments too.

    Continue reading...


     

    SQL Server: Locking basics November 15th, 2012

    Vinod Kumar

    The learning journey can never stop. As we learn the basic building blocks of SQL Server there is always a need to do refreshers. This blog is on the same lines. I would urge you to read the Blog around Concurrency over at Pinal’s site and then continue the reading below because the basics of Locking is incomplete if we don’t understand what are the concurrency basics. Just like you have traffic signals that regulates traffic to make sure there are no grid locks or long waits for commuters. The parallel lanes for traffic is synonymous to concurrency. SQL Server uses locks as an mechanism to bring the consistency at the same time build the concurrency for the system. Locks are inevitable in any database world and those are also fundamental building blocks.

    1. Locks are applied in both optimistic and pessimistic concurrency models.
    2. Locking is used for maintaining consistency for concurrent transactions.
    3. Read operations acquire shared locks, exclusive locks by write operations while update locks are got during initial portion of an update operation when SQL Server is searching for the data to update.
    4. SQL Server releases locks automatically and manages compatibility between various locking modes, resolves deadlocks and lock escalations are done to reduce overheads.
    5. SQL Server controls locks on tables, on the pages of the table, on index keys and on individual rows of data based on the operation done.

    Lock Modes

    1. Shared Locks
      1. Automatically acquired while reading data.
      2. This lock can be on a page, table, index key or individual row based on the isolation level.
      3. Multiple processes can hold shared locks on the same data and read from it too.
      4. No other process can get an exclusive lock on data that has a shared lock. Neither can a process acquire a shared lock when there is an exclusive lock already on the table.
      5. Shared locks are not held for the whole duration of read in the default isolation level.
    2. Exclusive Locks
      1. This lock is acquired on data when modifications are done by DML statements like INSERT, UPDATE or DELETE operation.
      2. At any point in time exclusive locks can be held by only one process.
      3. In an exclusive locking mode no other process can take locks in this process.
      4. Exclusive locks are taken for the duration of the transaction length as the process can either commit or rollback.
    3. Update Locks
    1. This is an hybrid of exclusive and shared locks.
    2. This lock is taken when SQL Server searches the table to find the resource that needs to be modified.
    3. This can also be initiated using using query hints. It is desirable not to use the same.
    4. Even in this lock, it is not the sufficient level to change data. SQL Server must take exclusive lock to modify data.
    5. Used as an intermediate lock before escalating to exclusive locks.
  • Intent Locks
    1. As the name suggests is a pre-qualifiers to shared/update/exclusive locks.
    2. Since SQL Server can acquire locks at different levels, before the process completes or the statements completes SQL Server might want to know if locks are already acquired.
    3. This is an intermediate locking state and not to be confused as a separate locking mode.
  • Special Lock Modes
    1. Schema stability locks – at the time of compilations, this lock makes sure that no other process is modifying the schema of the underlying objects.
    2. Schema modification locks – acquired when a table’s structure is being modified.
    3. Bulk update locks – locks taken for BULK INSERT command or bcp utility operation. This lock can also be turned on using the table hints.
  • Conversion Locks
    1. As the name suggests, this lock happens during a conversion from one mode to another. There are three types SIX, SIU, UIX where SIX is the most common and the details are below.
  • Key-Range Locks
    1. Locks taken in serializable isolation level for locking ranges of data.
    2. Can be taken only on keys.
  • Let us look at the common abbreviation and locking mode descriptions:

    1. S – Shared: Allows processes to read concurrently but cannot change the resource locked.
    2. X – Exclusive: Prevents processes from modifying or reading data in the data.
    3. U – Update: Prevents external processes from acquiring an update or exclusive lock.
    4. IS – Intent shared: Acquired when resource is locked with a shared lock.
    5. IU – Intent update: Acquired when the resource is locked with an update lock.
    6. IX – Intent exclusive: Acquired when the resource is locked with an exclusive lock.
    7. SIX – Shared with intent exclusive: Shows that a shared lock pages have either a page or row with exclusive locks.
    8. SIU – Shared with intent update: Shows that a shared lock pages have either a page or row with an update lock.
    9. UIX – Update with intent exclusive: Shows that a update lock pages have either a page or row with exclusive locks.
    10. Sch-S – Schema stability: Used to show a query using the object is being compiled at that moment.
    11. Sch-M – Schema modification: Used to indicate the table’s structure is being updated at this moment.
    12. BU – Bulk update: Lock acquired when bulk copy operation (like bcp) is copying data into a table.

    Lock Granularity

    1. SQL Server can lock resources at the table, page, partition or row level.
    2. If locks are escalated, SQL Server can also lock a single partition of a table or index.
    3. SQL Server can also lock index keys and ranges of index keys if needed.
    4. DMV sys.dm_tran_locks view keeps track of each lock and contains information about the resource which is locked and an identifier for the specific resource

    Key Locks

    1. SQL Server use of key locks depends on the isolation level of the transaction.
    1. If isolation level is Read Committed, Repeatable Read or Snapshot, SQL Server locks the actual index keys accessed while processing the query.
    2. If isolation level is serializable, to counter phantoms reads, key-range locks are acquired for the range of values queried.
    3. Incase of tables with clustered index, leaf node contains the data and hence the locks are acquired at this level.
  • There are 9 types of key-range locks:
    1. RangeS-S
    2. RangeS-U
    3. RangeIn-Null
    4. RangeX-X
    5. RangeIn-S
    6. RangeIn-U
    7. RangeIn-X
    8. RangeX-S
    9. RangeX-U 

    Other Locking Assets

    1. We saw locks on objects, pages, keys, partitions and rows. Three are other SQL Server can lock too.
    2. Extents are units of 64KB disk space that can be locked. This is a special type of lock that is taken when an object needs to expand and a new extent is allocated.
    3. Generally connections hold a lock on at least one database object and will have resource_type = DATABASE at a minimum running in the session.
    4. You occasionally have locks on individual partitions, indicated in the lock metadata as HOBT locks. Occurs when locks are escalated and escalation to that partition level is allowed

    Lock Duration

    1. The length of time that a lock is held depends primarily on the mode of the lock and transaction isolation level in effect.
    2. Shared locks in Read Committed and Snapshot isolation levels are released as soon as SQL Server has read and processed the locked data
    3. Shared locks behave the same as exclusive locks in Repeatable Read and Serializable isolation levels – they are not released until the end of the transaction
    4. Update locks are also held until the end of the transaction unless it has been promoted to an exclusive lock in which case it behaves like the exclusive lock

    Lock Ownership

    1. Lock duration is directly affected by lock ownership
    2. Ownership == scope of the lock
    3. Four types of lock scopes
      1. Transactions – Durations depend on isolation level and lock mode (shared locks and update/exclusive locks)
      2. Cursors – requested explicitly when a cursor is declared. If a cursor is opened using a locking mode of SCROLL_LOCKS, a cursor lock is held on every row fetched until the next row is fetched or the cursor is closed. Even if the transaction commits before the next fetch, the cursor lock is not released
      3. Transaction_Workspaces – acquired every time a database is accessed and the resource associated with these locks is always a database. A workspace holds database locks for sessions – usually there is one workspace per session and all DATABASE locks acquired in the session are kept in the same workspace object. In distributed transactions, multiple sessions are enlisted into the same workspace so they share the database locks
      4. Sessions – must be requested explicitly using the sp_getapplock procedure, and apply only to APPLICATION locks. Its duration is until the session disconnects or the lock is released explicitly

    Thanks for reading this far. I know there is more to learn and write like Lock Timeout, Locking Hints, Version Stores, Snapshot Isolation Level, Row Versioning, Deadlocks, Lock Escalations, Row-level Locking and Page-level Locking, Lock Blocks, internal locking etc !!! I will surely keep you posted similarly in future.

    Continue reading...


     

    Picture Post: Start a blog, be yourself November 14th, 2012

    Vinod Kumar

    Blogging is a communications mechanism handed to us by the long tail of the Internet – Tom Foremski

    For some blogging is an addiction, for some it is a profession, for some it is a sharing platform, for some it is a marketing engine, for some it is a way of life. Irrespective of what the outcome, everyone uses the blogging platform to become visible. I would surely urge you to start blogging because you never know how you might inspire someone some random day. It is a journey and you need to take it seriously if you want to get noticed.

    A blog is merely a tool that lets you do anything from change the world to share your shopping list.

    Not all blogs out there is built to impress us instantly, now understand if we don’t make a start, how do we know what the others outside want? So stop procrastinating and start sharing the love !!!

    Your blog is your unedited version of yourself.

    Continue reading...


     

    SQL Server: Transaction Logs and Recovery November 12th, 2012

    Vinod Kumar

    In my day-today customer interactions I meet a lot young, smart DBA’s who are still stepping into the ranks of making their applications robust. As part of their daily activities they are getting guided by some seniors who impose some of their views based on their past experience. Unfortunately, in this process the fundamentals are lost and as we build our career we need to understand the basics. One of the topics I explain almost every customer is about how Transaction Logs work, why they keep growing, how to make it cycle/reuse, what happens after backup etc. So I plan to write such posts in the future too, these are lists for reference making learning fun and easy. I am writing this post in the style of notes taken in a class, hope that will make reading easy and leaning faster :).

    Transaction Log Basics

    1. Transaction log records changes made to the database and stores enough information to allow SQL Server to recover the database.
    2. Recovery is the process of reconciling the data files and the log.
    3. Any changes to the data that the log indicates have been committed must appear in the data files and any changes that are not marked as committed must not appear in the data files
    4. Log also stores information on how to roll back transactions if a ROLLBACK TRAN is received from the client or a deadlock generates an internal ROLLBACK.
    5. One or more transaction log files are associated with a database when the database is created.
    6. Log record is labeled with a Log Sequence Number (LSN) which is guaranteed to be unique.
    7. Log entries part of the same transaction are linked so that they can be located easily for undo or redo activities.
    8. SQL Server keeps track of the current position in the log by the LSN and when a page is changed the LSN corresponding to the log entry for that change is written into the header of the data page.
    9. Dirty pages can be written to the disk only when the LSN on the page is less than or equal to the LSN for the last record written to the log.
    10. The Buffer Manager guarantees that the transaction log will be written before changes to the database are written (write-ahead logging).
    11. Buffer Manager also guarantees that log pages are written in a specific order making it clear which log blocks must be processed after a system failure regardless of when the failure occurred.
    12. Log records for a transaction are written to disk before the commit transaction is sent to the client process. Actual changed data might not have been written out to data pages yet.
    13. Though log writes are asynchronous, at commit time thread must wait for the write to complete to the point of writing the commit record in the transaction log. Data page writes are completely asynchronous.
    14. Logging involves "demarcating" the begin and end of each transaction with information about changes made to the data in between. At the end, its marked with a commit record.
    15. An aborted transaction undoes the changes made to the original data and these changes are written to the log and marked as "compensation log records".
    16. There are two types of recovery (goal for both is to make sure log and data are in sync):
      1. Restart Recovery – runs every time SQL Server is started. Runs on each database (in parallel) and the SQL Server error log tells you how many transactions were rolled forward and back. This is also called as Crash Recovery.
      2. Restore Recovery – also known as Media Recovery is run by request when a restore operation is requested via the backup route.
    17. Both the above types have to deal with 2 important situations:
      1. When transactions are recorded as committed in the log but not written to the data file.
      2. When changes to the data file don’t correspond to committed transactions. This can happen when a implicit indirect or explicit checkpoint forced this case.

    Phases of Recovery

    Now that I have set some context to the basic units of transactional logs and why they are used. We need to also understand the stages of recovery process.

    1. Phase 1: Analysis Phase – Forward pass starting at the last checkpoint record in the transaction log. Determines and constructs a Dirty Page Table (DPT) consisting of pages that might have been dirty when SQL Server stopped. Active Transactions Table is also built consisting of uncommitted transactions
    2. Phase 2: Redo Phase - Returns the database to the state it was in at the time SQL Server was stopped. Starting point for this forward pass is the start of the oldest uncommitted transaction. The minimum LSN in the DPT is the first page that is expected to be redone. But all logged operations starting at the oldest open transaction need to be redone for necessary locks to be acquired
    3. Phase 3: Undo Phase – Uses the list of Active Transactions found in Phase 1 to roll each transaction back individually. Any transaction that was not committed is undone
    4. Fast Recovery Phase – available in Enterprise and Developer edition allows for a database to be online as soon as redo phase is finished

    Page LSNs and Recovery

    1. Every database page has a LSN in the page header that reflects the location in the transaction log of the last log entry that modified a row on this page.
    2. Also keeps track of the LSN which was on the data page before the change recorded by the latest log record.
    3. During redo, LSN of each log record is compared to the LSN of the data page that the log entry modified.
      1. If it’s equal to the previous page LSN in the log record, the operation indicated in the log entry is redone.
      2. If it’s equal or higher than the actual LSN for the log record, REDO operation is skipped.
    4. A transaction log cannot be truncated prior to the point of the earliest transaction that is still open, no matter how many checkpoints have occurred.

    Virtual Log Files

    1. A transaction log for any database is maintained as a set of virtual log files (VLFs) who size is determined internally by SQL Server by the total size of all the log files and the growth increment used when enlarging the log.
    2. Log file is grown in units of entire VLFs and be shrunk only to a VLF boundary:
      1. When a log file is first created it always has between 2 and 16 VLFs.
      2. If its 1 MB or less – log file size is divided by minimum VLF size 31 * 8KB to determine number of VLFs.
      3. If its between 1 and 64 MB – log is split into 4 VLFs.
      4. If greater than 64 MB but less than 1 GB 8 VLFs are created.
      5. If greater than 1 GB, 16 VLFs are created.

        The above rules of thumb can be different depending on the version of SQL Server you are working.

    3. 4 states for a VLF:
      1. Active – active portion of the log begins at the minimum LSN representing an active transaction. The active portion of the log ends at the last LSN written
      2. Recoverable – portion of the log preceding the oldest active transaction is needed only to maintain a sequence of log backups for restoring the database to a former state
      3. Reusable – If transaction log backups are not being maintained or if log was already backed up, VLFs before the oldest active transaction are not needed and can be reused
      4. Unused – One or more VLFs at the physical end of the log files might not have been used yet if not enough log activity has taken place. Or if earlier VLFs have been marked as reusable and then reused
    4. Automatic Truncation – understand when the Log backups are not existent:
      1. You have configured the database to truncate a log on a regular basis by setting the recovery model to SIMPLE.
      2. You have never taken a full database backup.
      3. All log records prior to the oldest active transaction are invalidated and all VLFs not containing any part of the active log are marked as reusable. This process doesn’t shrink the physical file it is used in a cyclic manner.
    5. Automatic Shrinkage – A database is truncated to allow for shrinking. If autotruncate and autoshrink option is set, the log is physically shrunk at regular intervals. This is something not recommended, though this option exists.

    Database Recovery Models

    As we learn about transaction logs, we cannot miss understanding the recovery models and the effects of the same. There are 3 modes of recovery models:

    1. FULL Recovery Model
      1. Provides the least risk of losing work in case of a damaged data file.
      2. All operations are fully logged – in addition to logging every row changed via DML, the entire row is written to the transaction log using BCP or BULK INSERT operation.
      3. Also fully logs CREATE INDEX operations.
      4. Use this if you need to recover to a Point-in-time from your backup.
    2. BULK_LOGGED Recovery Model
      1. Allows you to restore a database completely in case of media failure and gives the best performance and least log space usage for certain bulk operation.
      2. Minimal logging compared to FULL recovery model.
      3. Minimal logging consists of logging information that is required to roll back the transaction without supporting point-in-time recovery.
      4. Every data file in SQL has a special page called Bulk Changed Map (BCM) page also called Minimally Logged Map (ML Map) page. Each bit on a BCM page represents an extent and if the bit is 1 it means that this extent has been changed by a minimally logged bulk operation since the last transaction log backup.
      5. BCM map is located on page 7 of a 4GB span and all the bits are reset to 0 every time a log backup occurs.
    3. SIMPLE Recovery Model
      1. Offers the simplest backup and restore strategy.
      2. Transaction log is truncated whenever a checkpoint occurs (which happens regularly).
      3. Only backups that can be made are ones that don’t require log backups.

    Choosing the right recovery model is very important for functioning of your databases.

    Backing Up and Restoring a Database

    SQL Server has four main types of backups:

    1. Full Backup – Copies all pages from a database onto a backup device.
    2. Differential Backup – Copies only the extents that were changed since the last full backup was made. Done by examining the bits on the DCM pages for each data file in the database. When any page in an extent is changed, the corresponding bit in the DCM page is set to 1
    3. Log Backup – Copies all the log records that have been written to the transaction log since the last full or log backup was made
    4. File and Filegroup Backup – these backups are intended to increase flexibility in scheduling and media handling compared to full backups, in particular for very large databases. Useful when database contains varying update characteristics or priority levels

    Thanks for reading this far. Hope the basics are clear now. Given these pointers, feel free to explore more into MSDN documentation.

    Continue reading...


     

    SQL DBA Checklist November 8th, 2012

    Vinod Kumar

    Long time back I did write about what activities constitute a DBA role and as I start meeting more DBA in my day job – I get asked, is there any checklist? If you really ask me, that article does call out most of the points. Here is just yet another list. Feel free to add more to this list -

    As a DBA we work to keep the systems up and running for the business, hence there are business requirements we need to be aware off like below – know the answers to the below and ask your respective stakeholders before designing the system:

    1. Establish specific SLAs (service level agreements) with stakeholders
    2. What Availability do they want? (aka  find our your maintenance windows)
    3. RPO (recovery point objectives – how much you can afford to lose if DR / corruption occurs)
    4. RTO (recovery time objective – how long to bring database/system back up after DR/Corruption)
    5. Points of contact (owners) for the various databases. This is true in consolidation environments. People change roles or switch jobs – keep this uptodate always.
    6. Change control – how often, who has what rights to DB, what auditing is in place etc. – especially important for shared instances
    7. Response times & escalation procedures (how soon you will do changes if you do them for the customer, how soon you respond when problems arise – are you a 24×6, 24×7, 7×12, 5×10 shop,  do you have people on call, how do they reach on call person, etc.)
    8. Based on the responses, make your backup strategy based on this because the RTO, RPO will be something decided by this strategy.
    9. Know the immediate or near future plans of the organization to support newer versions. Plan on a upgrade or migration strategy before hand and know the nuances. Check my previous post on Upgrading to SQL Server 2012.
    10. Know your various contact points from an Hardware perspective – SAN vendor, Software vendors, Network switch vendors, Network Admins and the various access mechanisms to reach the server. Document them and keep them handy always.

    Other lists include:

    1. Test your disaster recovery plan by a junior DBA to check if you have missed any steps.
    2. Pre-grow your databases to cover the projections for the next year
    3. Pre-size the tempDB to its regular maximum size.
    4. Check that security is still tight – people who have left the group/company no longer have logins, no new logins have snuck into highly privileged groups, etc.
    5. Check all your logs thoroughly for abnormality.
    6. If you’re not yet using Policy Based Management, double check that all your configuration settings are still correct.
    7. Take new performance baselines to track if the system is performing better compared to a baseline.
    8. Resync your test and development systems with production or production like data
    9. Implement some of those cool new techniques, functionality, tips, etc. you learned at your last conference. Always look at implementing new efficient methods of code.
    10. Ask your hardware admins to do low level hardware diagnostics
    11. Install MOM/SCOM agents (or at least some other monitoring / alerting tool).
    12. At the very least configure SQL (SMTP) Mail and Operator alerts for job failures.
    13. Ensure you have maintenance plans for re-indexing/defragging  and updating statistics.
    14. Configure your maintenance plans to pick up new databases automatically or write your own scripts to detect and configure new plans (in the process of writing some now).
    15. Add a job to recycle the error log every night to keep logs small.
    16. Keep an script handy for any non-compliance and keep running them time-to-time on the environment.
    17. Test your disaster recovery plan again!!

    Additionally I might do things on a daily basis and quarterly basis like, some tasks done daily are:

    1. Monitor and Check for blocking spids
    2. Monitor and check for deadlocks
    3. Monitor and check status of SQLAgent jobs
    4. Monitor disk growth (especially processes that might be eating up transaction log-space).
    5. Monitor for rogue, ad-hoc queries that might be running against your production systems (and take appropriate, punitive action).
    6. Check if there are Login Errors or any suspicious activity on the logs.

    Maybe quarterly I might do:

    1. Collect database and table growth history (at least once per week), then review growth rate every quarter.  Compare the actual growth rate against expected growth rate from the TECH spec  (DEV should always provide estimated growth rates in either the tech spec or deployment plan!)
    2. Create a simple SQL Profile trace that you can run as a SQLAgent job that collects samples of durations of the most critical stored procs and queries in the system.   Just like the growth rates above, compare the actual durations against expectations in the tech spec…   Also, look for concerning performance degradation over time.
    3. Collect blocking history and review trends quarterly
    4. Collect deadlock history and review trends quarterly
    5. Check who has access to the database regularly
    6. Keep looking at the organizations operational guides and see if there needs to be changes because of upgrades or if the behavior changed in the next releases.
    7. Check once in a while if the tapes and backups are uptodate and functional. This can be randomly done during the quarter.

    I am sure I am missing some of the vital points you are doing in your environment. So please feel free to add it over comments and I will be more than happy to merge them.

    Continue reading...


     

    Let go and move forward November 5th, 2012

    Vinod Kumar

    Courage is the power to let go of the familiar – Raymond Lindquist

    Life is about challenges, interesting twists and there is a strong hold we have to certain things. These holds can be because of 100 other reasons like our egos, emotions, love, passion, comfort etc. The list why we keep doing the way we do is numerous, but if we take a small step back and analyze within there are lots we can live without. In this blog post I am calling few of these from my experience that I feel we all need to let-go to move forward in life.

    1. Past failures are not shame

    A lot of us hold on to the failures of past – understand that the past is not predicting that your future will also be that way. If that is the case, then you have not learnt from the past failures or you are making the same conscious choice. Sometimes stop thinking about the past and think what you are doing right now and move forward.

    2. Others don’t control your life

    I did talk about this in my previous picture post around opinions. Stop letting the opinions of others decide what you do in your life today. What matters these days is what you feel about yourself that counts and not what others think of you. Understand that you have to do exactly what is best for you and your life not what is best for everyone else.

    3. Stop procrastinating ON your goals

    There is an old saying that the best time to plant a tree was 20 years back. If that is the case, the best time to live your dreams and pursue your goals is NOW. Stop procrastinating – period !!! There are two sides to the coin – accept what condition exists or take control with responsibility to change the situation in hand.

    Letting go doesn’t mean giving up, but rather accepting that there are things that cannot be – Anon

    4. Your right to be wrong 

    You don’t get a chance to choose how you are going to die or when. You can only decide how you are going to live right now. So every day is a new chance to choose and that choice is yours. Worst-case, never give up your right to be wrong. The experience that you will get from these decisions will make you move forward in life and become a better person.

    5. Running away is not solving 

    This is one big suggestion I give to almost anyone who comes to me. Stop running away from your problems. Face the issues, fix the problems, forgive, appreciate and communicate with the people who deserve it. Walk the fears you have and become a wise person.

    6. Make your decisions 

    Stop making excuses, stand up and be ready to say – “Yes, I screwed up”. Most of the long term failures are made because of indecisions & excuses and not by the decisions made at that moment. Don’t try to paralyze yourself by over-analyzing – take a decision now and move forward. There are always times you can make appropriate course corrections if needed.

    7. Appreciate your moments 

    We all tend to be so much far sighted that we forget the moments that is in front of us. A classic example, we are running behind planning our children’s future and forgetting the need to appreciate your present moment when they are growing up, they started walking, they started bicycling, made their first drawing etc. Quite often we try to accomplish something big without realizing that the greatest part of life is made up of the little things.

    Some think it’s holding on that makes one strong; sometimes it’s letting go – Sylvia Robinson

    Thanks for reading this far. There are surely things you strongly believe we need to let-go and I am all ears to listen to your views.

    Continue reading...


     

    Picture Post: Opinions and Perspectives October 31st, 2012

    Vinod Kumar

    Everything we hear is an opinion, not a fact. Everything we see is a perspective, not the truth – Marcus Aurelius

    People always have opinions and there is something to give others but we think differently when it comes to self. In this context, I thought this picture post has 4 different quadrants that give different ways we look at how we see opinions based on our view / knowledge and others views / knowledge.

    You can also apply this concept for work, your job, handling kids, handling seniors, handling teachers etc. Almost every place this holds good.

    Quadrant 1: Neither you or other know about this. This is a classic example where a lot of learning exists. Research is one such area.

    Quadrant 2: You know more than the average Joe and this can be frustrating sometimes. A classic example will be for people who are into Niche Product Engineering teams

    Quadrant 3: If others know more than you then you might be into this soul searching mode why you are so lost. A classic example for me is when people talk about Photography techniques and it is completely blank for me :)

    Quadrant 4: Both you and the other party know enough details. Now this is an area of intellectual talk and we are open to learning mode in this zone.

    Other people’s opinion of you does not have to become your reality – Les Brown

    All I have to say is – Don’t let the opinions of others control the way you look at life / work or anything. It is not what others think, it is what you think about yourself that matters. You take bold decisions and steps based on what is best for you and your life, not based on what is best for others – be yourself and make your way and mark.

    Thanks for read this far. Feel free to drop your comments.

    Continue reading...


     

    SQL Server Script: When were Statistics last updated October 30th, 2012

    Vinod Kumar

    At my job I often help customers with Performance tuning their SQL Server environments and their application. One of the common recommendation we give is to check their maintenance plans and see if the Statistics of tables are up-to-date. This is a very common exercise and given that you have 1000s of tables to monitor, you might want an easy script to figure out which are those tables / indexes that need attention. I am giving a simple script that we use at our environments to identify the same.

    SELECT 
    OBJECT_NAME(ind.object_id) AS ‘Table Name’, 
    ind.name AS ‘Index Name’, 
    STATS_DATE(ind.object_id, ind.index_id) AS ‘Statistics Date’
    FROM  sys.indexes ind
    WHERE OBJECTPROPERTY(object_id,‘IsMSShipped’)=0
    ORDER BY 3 DESC

    With the above script the output would be as below:

    image

    Look at the “Statistics Date” column and this gives you information of how dated the statistics are. Once you have figured out the statistics are out-of-date by few weeks or months, use the UPDATE STATISTICS command to update the same. Yet another command used for this purpose is sp_updatestats.

    Also, even if you have AUTO_CREATE_STATISTICS, AUTO_UPDATE_STATISTICS and AUTO_UPDATE_STATISTICS_ASYNC (Statistics documentation) options enabled inside your database Statistics *can* be out-of-date. So analyze your environments from time-to-time and then come up with your updating strategy.

    Continue reading...


     

    SQL Server: How to find mapping of tables with filegroups October 29th, 2012

    Vinod Kumar

    One of the recommendations I give to customers coming to MTC is to do proper placement of tables to appropriate filegroups. The default behavior is – SQL Server would create a default PRIMARY filegroup and all the data would be placed into the .mdf file. And this is something I have seen at a lot of ISV’s forget to work on and configure.

    Recently, when this recommendation was given, one of the DBA did ask me – “How do we know which table is in which filegroup? Is there an instant script for the same?”. Well, there are a number of ways to find this information and I am attaching the same for reference here.

    Method 1: sp_help

    The simplest and the old technique is to use our proven sp_help. The last result set has the filegroup this table dbo.t1 is associated with.

    sp_help ‘[dbo].[t1]‘
    go 

    A typical output looks like below:

    image

    Method 2: sp_objectfilegroup

    The limitation of the method 1 is that it gives in different result set and it is difficult to take this information for future use. Here is an undocumented procedure which can get you this information.

    DECLARE @ObjectID INT = (Object_id(‘[dbo].[t1]‘))
    EXEC sys.sp_objectfilegroup @ObjectID
    go 

    The output for the above call is:

    image

    Method 3: DMV’s

    Since SQL Server 2005 we have DMVs that give us important information and interesting insights that we are not aware off. And this information is also hidden inside few DMVs like the query below.

    SELECT d.name AS Data_located_on_filegroup
    FROM   sys.data_spaces d
    WHERE  EXISTS (SELECT 1
                   FROM   sys.indexes i
                   WHERE  i.object_id = OBJECT_ID(‘[dbo].[t1]‘)
                          AND i.index_id <= 1
                          AND d.data_space_id = i.data_space_id)

    GO 

    The output of this query would look like:

    image

    A small extension to the same query can be made in such a way that we can get all the tables and the filegroups these tables are mapped to. So feel free to use the same.

    SELECT OBJECT_NAME (a.object_id) AS ObjectName,
           (SELECT name
            FROM   sys.data_spaces
            WHERE  data_space_id = a.data_space_id) AS FileGroupName
    FROM   sys.indexes a
    WHERE  index_id <= 1 

    I just ran this on my AdventureWorks2012 DB to get the output as below.

    image

    Thanks for reading so far. Hope this query will help you plan placing your tables in the right filegroups.

    Continue reading...