// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Setting Up the MySQL Database Server in the Windows Operating System
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:syntax: true
:icons: font
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Setting Up the MySQL Database Server in the Windows Operating System - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Setting Up the MySQL Database Server in the Windows Operating System

The MySQL database server is one of the most popular open-source database servers commonly used in web application development.

This document recommends a sequence of steps to set up the MySQL database server 5.6 versions in the Windows operating system. It does not cover MySQL configuration details, it describes a sequence of required steps.

For information about installing and configuring MySQL database server for other operating systems, refer to the link:http://dev.mysql.com/doc/refman/5.6/en/installing.html[+Installing and Upgrading MySQL+] documentation.

NOTE: The link:../../72/ide/install-and-configure-mysql-server.html[+Setting Up the MySQL Database Server 5.1 versions in the Windows Operating System+] document provides the instructions on setting up the 5.1 versions of MySQL Server on Windows.


== Starting the Download

1. Go to link:http://dev.mysql.com/downloads/installer/[+http://dev.mysql.com/downloads/installer/+].
2. Click the Download button.
3. Save the installer file to your system.

== Starting the Installation

After the download completes, run the installer as follows:

1. Right-click the downloaded installation file (for example,  ``mysql-installer-community-5.6.14.0.msi`` ) and click Run.
The MySQL Installer starts.
2. On the Welcome panel, select Install MySQL Products.
3. On the License Information panel, review the license agreement, click the acceptance checkbox, and click Next.
4. On the Find latest products panel, click Execute. 
When the operation is complete, click Next.
5. On the Setup Type panel, choose the Custom option and click Next.
6. On the Feature Selection panel, ensure MySQL Server 5.6.x is selected, and click Next.
7. On the Check Requirements panel, click Next.
8. On the Installation panel, click Execute.
When the server installation is completed successfully, the information message appears on the Installation panel. Click Next.
9. On the Configuration panel, click Next.
10. At the first MySQL Server Configuration page (1/3), set the following options:
* *Server Configuration Type*. Select the Development Machine option.
* *Enable TCP/IP Networking*. Ensure the checkbox is selected and specify the options below:
* *Port Number*. Specify the connection port. The default setting is 3306 - leave it unchanged if there is not special reason to change it.
* *Open Firewall port for network access*. Select to add firewall exception for the specified port.
* *Advanced Configuration.* Select the Show Advanced Options checkbox to display an additional configuration page for setting advanced options for the server instance if required.

NOTE: Choosing this option is necessary to get to the panel for setting the network options where you will turn off the firewall for the port used by the MySQL server.

Click Next.

[start=11]
. At the second MySQL Server Configuration page (2/3), set the following options:
* *Root Account Password*.
* *MySQL Root Password*. Enter the root user's password.
* *Repeat Password*. Retype the root user's password.

NOTE: The root user is a user who has full access to the MySQL database server - creating, updating, and removing users, and so on. Remember the root password - you will need it later when creating a sample database.

* *MySQL User Accounts*. Click Add User to create a user account. In the MySQL User Details dialog box, enter a user name, a database role, and a password (for example,  ``!phpuser`` ). Click OK.

Click Next.

[start=12]
. At the third MySQL Server Configuration page (3/3), set the following options:
* *Windows Service Name*. Specify a Windows Service Name to be used for the MySQL server instance.
* *Start the MySQL Server at System Startup*. Leave the checkbox selected if the MySQL server is required to automatically start at system startup time.
* *Run Windows Service as*. Choose either:
* *Standard System Account*. Recommended for most scenarios.
* *Custom User*. An existing user account recommended for advanced scenarios.
Click Next.

[start=13]
. At the Configuration Overview page, click Next.
. When the configuration is completed successfully, the information message appears on the Complete panel. Click Finish.

NOTE: To check that the installation has completed successfully, run the Task Manager. If the  ``MySQLd-nt.exe``  is on the Processes list - the database server is running.

